xslt将属性转换为新元素

时间:2014-02-13 15:55:55

标签: xml xslt

我正在尝试使用xslt将简单的xml转换为结构化的xml。

这是我的xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <foo bar="12" baz="34">ONE</foo>

这就是我想要的:

 <?xml version="1.0" encoding="UTF-8"?>
 <foo>
  <a> 
   <a> 
    <a>bar</a>
    <v>12</v> 
  </a> 
 <a>   
    <a>baz</a>     
    <v>34</v>   
 </a>  

<v>ONE</v> 
</foo>

“foo”元素包含两个属性,“bar”和“baz”以及元素“ONE”的值。在转换后的格式中,元素foo将包含属性序列“a”,其将包含属性序列“a”。

属性sequence-of将包含“a”和“v”元素,它们将分别是属性的名称和值。 foo元素的所有属性都包含在属性序列中。 foo的值位于属性序列之后的“v”元素内。 我可以将属性分解为元素,但我不知道如何添加新元素。

1 个答案:

答案 0 :(得分:1)

我猜你想要的东西是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/*">
<xsl:copy>
    <xsl:apply-templates select="@*"/>
    <v><xsl:value-of select="."/></v> 
</xsl:copy>
</xsl:template>

<xsl:template match="@*">
<a> 
    <a><xsl:value-of select="name()"/></a>
    <v><xsl:value-of select="."/></v> 
</a> 
</xsl:template>

</xsl:stylesheet>

应用于您的输入:

<?xml version="1.0" encoding="UTF-8"?>
<foo bar="12" baz="34">ONE</foo>

结果是:

<?xml version="1.0" encoding="utf-8"?>
<foo>
  <a>
    <a>bar</a>
    <v>12</v>
  </a>
  <a>
    <a>baz</a>
    <v>34</v>
  </a>
  <v>ONE</v>
</foo>