2010-08-07 130 views

回答

7

使用一些標準的XPath功能

找到,如果當前節點的名稱以字符串"c"使用開始:

starts-with(name(), 'c') 

找到,如果當前節點的名稱中包含字符串"c"使用:

contains(name(), 'c') 

要選擇XML文檔,他們的名字開始與"c"使用中的所有元素:

//*[starts-with(name(), 'c')] 

要選擇XML文檔中名稱包含"c"的所有元素,請使用:

//*[contains(name(), 'c')] 

編輯:在OP已要求額外的問題:如何選擇他的名字是一個在一組名稱中的所有元素?

的XPath 2.0

//*[name(.)= ('c1', 'c2', 'c3')] 

這使用一般比較運算符=,並選擇其名稱在序列('c1', 'c2', 'c3')的字符串之一文檔中的所有元素。

這不僅可以使用XPath 1.0來完成,

XSLT 1.0 + 1的XPath。0

該轉化

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" > 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<my:names> 
    <name>c1</name> 
    <name>c2</name> 
    <name>c3</name> 
</my:names> 

<xsl:variable name="vNames" select= 
    "document('')/*/my:names/*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:copy-of select="//*[name()=$vNames]"/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加(校正爲良好的形成):

<a> 
<b n="n1n1n1n1"> 
<c1> drftgy </c1> 
</b> 
<c2> dddd </c2> 
</a> 

產生想要的結果

<c1> drftgy </c1> 
<c2> dddd </c2> 
+0

謝謝,以及如何檢查多個值。例如:有很多種標籤c。所以我想檢查一些不是全部。並且表達式如下所示: //包含(name(),'c1')或contains(name(),'c2')或contains(name() // * [contains(name(),'c1'|'c2'|'c3')] 哪一個可能?還有其他解決方案嗎? – user402802 2010-08-08 08:20:37

+0

@ user402802:我已將添加到我的回答中的解決方案發表在您評論中的最後一個問題。 – 2010-08-08 13:51:33

+0

+1擴展答案,規格鏈接和XPath版本的區別。 – 2010-08-09 13:58:00

1

使用XPath 2.0和XQuery 1.0,您可以使用//*[local-name() = ('c1', 'c2', 'c3')]或者您可以使用正則表達式匹配//*[matches(local-name(), '^c[123]$')]

相關問題