2013-03-08 35 views
0

我有以下XSL模板:XSLT的xsl:副本的xsl:for-各有关属性

<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个属性。这就是为什么每个都是必要的。我想以同样的方式处理所有这些属性。我试图打印“当前()”值,它始终正常工作。问题在于更新原始节点的属性。将“href”属性的值设置为“anything”是行不通的,因为我猜测在我调用它的时候,它位于for-each块内,这意味着当前节点是属性本身。

我应该如何在for-each块中设置原始块的属性,以便复制的节点将使用修改后的属性?

预先感谢您。

回答

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

我喜欢它了很多先生谢谢! – 2013-03-08 11:52:01