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

Unm*_*kar 17 xml xslt xpath

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

<Document>
    <NodeA></NodeA>

    <NodeB></NodeB>

    <ServiceNode></ServiceNode>

    <NodeX></NodeX>
</Document>
Run Code Online (Sandbox Code Playgroud)

我想写一个匹配除所有节点模板ServiceNodeNodeANodeX.如何编写这个Xpath来获取 -

<xsl:template match="ALL Nodex Except ServiceNode">
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 29

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

如果"node"表示元素,则使用:

<xsl:template match="*[not(self::ServiceNode)]">
Run Code Online (Sandbox Code Playgroud)

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

<xsl:template match="node()[not(self::ServiceNode)]">
Run Code Online (Sandbox Code Playgroud)

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

<xsl:template match="Document/node()[not(self::ServiceNode)]">
Run Code Online (Sandbox Code Playgroud)

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

<xsl:template match="/*/node()[not(self::ServiceNode)]">
Run Code Online (Sandbox Code Playgroud)


Fla*_*ack 6

你最好使用这个表达式:

*[not(self::ServiceNode)]
Run Code Online (Sandbox Code Playgroud)

包含在 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>
Run Code Online (Sandbox Code Playgroud)

使用此 XML 示例:

<Document>
    <NodeA>1</NodeA>
    <NodeB>2</NodeB>
    <ServiceNode>3</ServiceNode>
    <NodeX>4</NodeX>
</Document>
Run Code Online (Sandbox Code Playgroud)

它将给出正确的结果:

1
2
4
Run Code Online (Sandbox Code Playgroud)

  • 正确的。这比在 name() 或 local-name() 上测试要好。在 XPath 2.0 中,另一种选择是 (* 除了 ServiceNode) (4认同)

use*_*826 5

<xsl:template match="Document/*[name() != 'ServiceNode']">
Run Code Online (Sandbox Code Playgroud)

(或者local-name()如果您必须处理名称空间)