如何编写xpath以匹配除特定元素之外的所有元素

时间:2011-02-01 07:02:42

标签: xml xslt xpath

我正在编写一个XSL转换。我想编写一个模板,该模板匹配文档的所有子元素,除了一个特定节点。我的xml看起来像这样 -

<Document>
    <NodeA></NodeA>

    <NodeB></NodeB>

    <ServiceNode></ServiceNode>

    <NodeX></NodeX>
</Document>

我想编写一个模板,该模板匹配除ServiceNode之外的所有节点,即NodeANodeX。如何编写此Xpath来获取 -

<xsl:template match="ALL Nodex Except ServiceNode">

5 个答案:

答案 0 :(得分:29)

  

我想写一个模板   匹配除ServiceNode之外的所有节点   即NodeA到NodeX。

如果“node”表示元素,请使用

<xsl:template match="*[not(self::ServiceNode)]">

如果“节点”是指任何节点(类型为元素,文本,注释,处理指令):使用

<xsl:template match="node()[not(self::ServiceNode)]">

如果您只想匹配Document的孩子,请使用:

<xsl:template match="Document/node()[not(self::ServiceNode)]">

如果您只想匹配top元素的子元素,请使用:

<xsl:template match="/*/node()[not(self::ServiceNode)]">

答案 1 :(得分:4)

你应该更好地使用这个表达式:

*[not(self::ServiceNode)]

包含在XSLT中:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="/*">
        <xsl:apply-templates select="*[not(self::ServiceNode)]"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:value-of select="."/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

使用此XML示例:

<Document>
    <NodeA>1</NodeA>
    <NodeB>2</NodeB>
    <ServiceNode>3</ServiceNode>
    <NodeX>4</NodeX>
</Document>

它会给出正确的结果:

1
2
4

答案 2 :(得分:2)

<xsl:template match="Document/*[name() != 'ServiceNode']">

(或local-name()如果你必须处理命名空间)

答案 3 :(得分:1)

您可以使用两个模板:

<xsl:template match="Document/*">
   ...do something...
</xsl:template>


<xsl:template match="Document/ServiceNode" />

后面的模板将具有优先权,因此第一个模板将匹配除ServiceNode之外的所有内容。

答案 4 :(得分:0)

/Document/*[not(name()='ServiceNode')]