XSL将根节点复制到+ add属性

时间:2011-07-01 05:14:32

标签: xml xslt copy

我是XSLT的新用户,并且一直在努力解决这个问题。

源XML:

<ABC X="" Y="" Z=""/>

结果XML:

<CDE F="">
<ABC X="" Y="" Z"" G=""/>
</CDE>

因此我需要

  • 使用结果xml中具有默认值的属性创建根节点。
  • 复制节点(源只有一个节点)从源到结果xml。
  • 向从源xml复制的节点添加其他属性。

我可以单独执行这些操作,但我无法在一个XSLT中完成所有这些操作。

2 个答案:

答案 0 :(得分:2)

根据您的假设,您似乎需要一个最小模板:

<xsl:template match="ABC">
 <CDE F="">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:attribute name="G">hello</xsl:attribute>
   </xsl:copy>
 </CDE>
</xsltemplate>

或者,如果您愿意:

<xsl:template match="/">
 <CDE F="">
  <xsl:apply-templates select="ABC"/>
 </CDE>
</xsl:template>

<xsl:template match="ABC">
   <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:attribute name="G">hello</xsl:attribute>
   </xsl:copy>
</xsl:template>

答案 1 :(得分:0)

您的示例XML不需要它(请参阅@ empo的答案),但在开始时,要学习的最重要的事情是“身份转换”模板。它基本上按原样复制所有XML输入并且未经修改。您需要进行的任何更改通常可以通过使用其他模板覆盖身份转换来完成。

这是一个示例样式表,为您提供所需的输出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="/ABC">
    <CDE F="">
      <ABC G="">
        <xsl:copy-of select="@*"/>
      </ABC>
    </CDE>
  </xsl:template>

</xsl:stylesheet>

注意:处理输入XML时不会使用“identity transform”,因为match="/ABC"模板会处理您拥有的一个元素。但是,如果要向XML添加内容,它将不会更改地包含在输出中。

例如,这个修改过的XML输入:

<ABC X="" Y="" Z="">
  <FOO BAR=""/>
</ABC>

使用以下样式表进行传输(与上面相同,只是我将<xsl:apply-templates/>添加到/ABC模板):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="/ABC">
    <CDE F="">
      <ABC G="">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </ABC>
    </CDE>
  </xsl:template>

</xsl:stylesheet>

产生以下输出:

<CDE F="">
   <ABC G="" X="" Y="" Z="">
      <FOO BAR=""/>
   </ABC>
</CDE>