我是XSLT(2.0)的新手,我遇到了以下情况。我有XML输入,如下所示:
<root>
<elem name="elemName1">
<subel1>value</subel1>
<subel1>value2</subel1>
</elem>
<elem name="elemName2">
<subel1>value</subel1>
<subel1>value2</subel1>
</elem>
<elem name="elemName3">
<subel2>value</subel2>
<subel2>value2</subel2>
</elem>
<referencing>
<something type="elemName1"/>
</referencing>
<referencing>
<something type="elemName2"/>
</referencing>
<referencing>
<something type="elemName3"/>
</referencing>
</root>
我需要两件事:
<elem>
中包含<subel1>
的所有elemNameX
元素的属性名称更改为newelemNameX
<something>
的{{1}}属性以引用这些新名称。我设法做了第一步,但我在第二步
我正在考虑浏览所有type
并尝试查找\\something\@type
。但我无法匹配第一步中创建的修改后的\\elem[@name='newelemX']
。
是否可以匹配不同模板中一个模板的结果?
答案 0 :(得分:0)
我正在考虑通过所有\ something \ @type并尝试查找 \ ELEM [@name =&#39; newelemX&#39]。但我无法匹配修改后创建的 第一步。
是否可以匹配不同模板中一个模板的结果?
如果您已将模板评估结果分配给变量,那么可以(在XSLT 2.0中)。例如,您可以通过将模板应用于变量中记录的节点序列来执行此操作。但是,如果您愿意允许重复逻辑,那么您就不需要遇到这种麻烦。您甚至可以在XSLT 1.0中执行 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Identity transform for where there is no more specific match -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<!-- modified "name" attributes for certain "elem" elements -->
<xsl:template match="elem[subel1]/@name">
<xsl:attribute name="name">new<xsl:value-of select="."/></xsl:attribute>
</xsl:template>
<!-- "type" attributes of "something" elements -->
<xsl:template match="something/@type">
<!-- need to capture the current value for use in a test expression -->
<xsl:variable name="current_value" select="." />
<xsl:attribute name="type">
<!-- insert "new" into the value where needed (logic duplicated here) -->
<xsl:if test="/descendant::elem[@name=$current_value]/subel1">new</xsl:if>
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>