我的XML看起来像这样:
<root>
<do>
<img attr1="test">
<subnode attr1="test">
<text>THIS</text>
</subnode>
<img>
<other />
<text />
<do>
<do>
<text />
<do>
<text />
</root>
我想在img / subnode中的Text节点中插入do-Element的数量。到目前为止,我确实有这个XSLT:
<xsl:template match="root">
<xsl:for-each select="do">
<xsl:call-template name="alter-pos">
<xsl:with-param name="count" select="position()"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="alter-pos">
<xsl:param name="count"/>
<!-- How to copy everything and alter Text? -->
</xsl:template>
如何在保持变量计数的同时复制所有元素以替换Text内容?我用应用模板尝试了它,但是其他深度的文本也被改变了......任何帮助都会受到赞赏。
答案 0 :(得分:1)
使用标准模式匹配identity transform可能会更好。
要记住的关键事项是position()
仅适用于当前节点,但我找到了article that has an alternative。
重要的是为要更改的文本节点定义正确的模板,如下所示:
<xsl:template match="img/subnode/text/text()">
<xsl:value-of select="count(ancestor::do[1]/preceding-sibling::do) + 1"/>
<xsl:value-of select="."/>
</xsl:template>
在这里,我们仅匹配img/subnode/text/text()
节点,然后找到最近的do
祖先元素 - 如果嵌套了do
,这可能会导致问题。然后,我们计算先前do
个元素的数量,并输出该数字以及img/subnode/text
节点的文本。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="img/subnode/text/text()">
<xsl:value-of select="count(ancestor::do[1]/preceding-sibling::do) + 1"/>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
<root>
<do>
<img attr1="test">
<subnode attr1="test">
<text>THIS</text>
</subnode>
</img>
<other />
<text />
</do>
<do>
<img attr1="test">
<subnode attr1="test">
<text>more tasks</text>
</subnode>
</img>
<other />
<text>A different task</text>
</do>
<do>
<text />
</do>
<text />
</root>
<?xml version="1.0"?>
<root>
<do>
<img attr1="test">
<subnode attr1="test">
<text>1THIS</text>
</subnode>
</img>
<other/>
<text/>
</do>
<do>
<img attr1="test">
<subnode attr1="test">
<text>2more tasks</text>
</subnode>
</img>
<other/>
<text>A different task</text>
</do>
<do>
<text/>
</do>
<text/>
</root>