我有一个节点集,我想使用谓词从中选择仅将模板的当前节点作为父节点的节点。
我正在使用 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()
的简写,指的是上下文节点(通过此谓词执行测试的节点)的父节点。