XPath 谓词 "is parent the current node?"

XPath Predicate "is parent the current node?"

我有一个节点集,我想使用一个谓词来 select 从它只有那些将模板的当前节点作为其父节点的节点。

我正在使用 XSL 1.0 和 msxsl。

在下面的非工作代码中,谓词 [parent::current()] 无法正常工作,因为 current() 不是有效的 NodeTest:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:variable name="set" select="//node[@attr1 = 'bbb']"/>

    <xsl:template name="TemplateA">
        <xsl:for-each select="$set[parent::current()]">
            <result-node>
                <xsl:value-of select="@value"/>
                <xsl:text>A</xsl:text>
            </result-node>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="TemplateB">
        <xsl:for-each select="$set[parent::current()]">
            <result-node>
                <xsl:value-of select="@value"/>
                <xsl:text>B</xsl:text>
            </result-node>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="/body">
        <result>
        <xsl:for-each select="parentNode">
            <xsl:call-template name="TemplateA" />
            <xsl:call-template name="TemplateB" />
        </xsl:for-each>
        </result>
    </xsl:template>

</xsl:transform>

这里有一个示例 XML 来满足以上内容:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <parentNode>
        <node attr1="aaa" value="1" />
        <node attr1="bbb" value="2" />
    </parentNode>

    <parentNode>
        <node attr1="aaa" value="3" />
        <node attr1="bbb" value="4" />
    </parentNode>
</body>

这是所需的输出:

<result>
    <result-node>2A</result-node>
    <result-node>2B</result-node>
    <result-node>4A</result-node>
    <result-node>4B</result-node>
</result>

上面的例子也可以在这里找到:http://xsltransform.net/jyH9rMg

在 XSLT 1.0 中比较节点身份的方法是使用 generate-id():

<xsl:for-each select="$set[generate-id(..) = generate-id(current())]">

..parent::node() 的 shorthand 并且指的是上下文节点的父节点(通过谓词的执行测试的节点)。