java - XSLT xsl :copy and xsl:for-each on attributes

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

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

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

提前谢谢您。

最佳答案

您可以考虑使用与您想要以不同方式处理的属性相匹配的模板,而不是 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>

关于java - XSLT xsl :copy and xsl:for-each on attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292833/

相关文章:

java - 如何判断一个字符串是否是子字符串。 java

java - 在 Spark 流式转换中使用第三方不可序列化对象

xml - 无需输入 XML 的 XSLT 参数身份转换

.net - 如何将RDFS转换为RDFS?

python - 如何从描述符将属性请求委托(delegate)给 MRO 链

java - 多次调用 Method/Field.getAnnotation(Class) 与在 Map 中预缓存此数据的性能

java - XSL-FO - 如何动态设置页面方向?

java - XSLT 和 Java : Default Namespace XMLNS

java - CustomControl,xml 属性不适用于数据绑定(bind)

python - 无法在 "object"类的实例上设置属性