如何编写一个xpath来选择一个文本包含特殊字符的节点,如apostorophe?

时间:2012-01-20 17:00:43

标签: xml xslt xpath apostrophe

如何编写一个xpath来选择一个文本包含特殊字符的节点,例如'哪种无效的inxpath?

<Nodes><Node><Text>General Marketing'</Text><Nodes><Node><Text>Brochures</Text></Node><Node><Text>Value-Added</Text><Nodes><Node><Text>About Henderson</Text></Node><Node><Text>Own the World</Text></Node></Nodes></Node></Nodes></Node></Nodes>

var branchName = "General Marketing'";
var xPath = String.Format("/Nodes/Node[Text = '{0}']", branchName);

上述xpath失败,因为xPath包含以下文本:

/Nodes/Node[Text = 'General Marketing''] 

如你所见,有2个奸犯。

到目前为止我的测试只有'问题'。不确定是否还有其他可能有问题的特殊字符?

所以我想我需要将我的xpath修改为其他内容。

我尝试了以下但没有奏效:

var xPath = String.Format("/Nodes/Node[Text = \"{0}\"]", branchName);

希望问题很明确。

谢谢,

1 个答案:

答案 0 :(得分:3)

使用

//Text[.="General Marketing'"]

如果在XSLT中使用此XPath表达式,则整个XPath表达式myst将被撇号包围,并且必须使用内置实体&apos;转义由引号括起的字符串的最后一个字符(撇号):< / p>

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select='//Text[.="General Marketing&apos;"]'/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<Nodes>
    <Node>
        <Text>General Marketing'</Text>
        <Nodes>
            <Node>
                <Text>Brochures</Text>
            </Node>
            <Node>
                <Text>Value-Added</Text>
                <Nodes>
                    <Node>
                        <Text>About Henderson</Text>
                    </Node>
                    <Node>
                        <Text>Own the World</Text>
                    </Node>
                </Nodes>
            </Node>
        </Nodes>
    </Node>
</Nodes>

选择了想要的元素并将其复制到输出

<Text>General Marketing'</Text>

这比其他方法更简单,例如:

//Text[. = concat('General Marketing', $vQ)]

其中变量$vQ定义为:

<xsl:variable name="vQ">'</xsl:variable>