使用xslt向每个子节点添加属性

时间:2016-11-22 16:41:14

标签: xml xpath xslt-1.0

早上好, 我正在尝试编写一个XSLT 1.0 trasformation来转换这个

<foo>
  <document>
    <content name="bar1">Bar1</content>
    <content name="bar2">Bar2</content>
    <content name="bar3">Bar3</content>
     ...
  </document>
</foo>

到这个

<foo>
  <document>
    <content name="bar1" set="top">Bar1</content>
    <content name="bar2" set="top">Bar2</content>
    <content name="bar3" set="top">Bar3</content>
     ...
  </document>
</foo>

所以我尝试了这个XSLT转换

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

<foo>
  <document>
    <xsl:template match="/document/*">
      <xsl:copy>
        <xsl:apply-templates />
        <xsl:attribute name="set" select="'top'" />
      </xsl:copy>
    </xsl:template>
 </document>
</foo>

但遗憾的是它不起作用

我已尝试在xpath和xslt指南中搜索很多内容,但我无法完成这项工作,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您的XSLT语法已关闭。有很多方法可以做到这一点,这是一种相当通用的方式:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="content">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:attribute name="set">top</xsl:attribute>
      <xsl:value-of select="." />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

第一个模板是身份模板;第二个模板匹配content个节点,复制它们及其属性,并添加属性set="top"和元素的内容。