XSLT xsl:copy和xsl:for-each属性

时间:2013-03-08 11:22:19

标签: java xslt attributes foreach copy

我有以下xsl模板:

<xsl:template match="@*|node()" mode="fix-entity-references">   
    <xsl:copy>
        <xsl:for-each select="@*">
            <xsl:if test="name() = 'href'"> 
              <xsl:variable name="hrefvar">
                <xsl:value-of select="current()"/>
              </xsl:variable>
              <xsl:attribute name="href">
                anything
              </xsl:attribute>
            </xsl:if>
        </xsl:for-each>
        <xsl:apply-templates select="@*|node()" mode="fix-entity-references"/>
    </xsl:copy>
  </xsl:template>

我想使用此模板复制当前节点,但仅在处理完所有属性后才能复制。当前样本非常简单,可以用非常简单的块代替。测试表达式要复杂得多,重点是每个元素上都有N个属性来满足表达式。这就是为什么每个都是必要的。我想以同样的方式处理所有这些属性。我试图打印“current()”值,它总能正常工作。问题是更新原始节点的属性。将“href”属性的值设置为“任何”将不起作用,因为我想在我调用它时,它位于for-each块内,这意味着当前节点是属性本身。

如何从for-each块内部设置原始块的属性,以便复制的节点将使用修改后的属性?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以考虑使用与您想要区别对待的属性匹配的模板,而不是for-eachif,例如。

<xsl:template match="@*|node()" mode="fix-entity-references">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" mode="fix-entity-references"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@href | @foo | @bar" mode="fix-entity-references">
  <xsl:attribute name="{name()}">
    <xsl:value-of select=".."/>
  </xsl:attribute>
</xsl:template>

在XPath数据模型中,属性节点不被视为元素的子节点,但属性节点的父节点属性所属的元素(即,当上下文节点是属性时, ..是可以在其上找到属性的元素。因此,此示例将使用属性的包含元素的文本内容替换任何hreffoobar属性的值,即

<a href="#">http://example.com</a>

会变成

<a href="http://example.com">http://example.com</a>