如何将参数传递给子节点的模板?

时间:2014-01-09 00:02:31

标签: xslt position

我的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内容?我用应用模板尝试了它,但是其他深度的文本也被改变了......任何帮助都会受到赞赏。

1 个答案:

答案 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>

应用于此XML:

<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>