将元素属性转换为子元素

时间:2013-03-04 13:52:35

标签: xml xslt

我有一些看起来像这样的xml片段

<an_element1 attribute1="some value" attribute2="other value" ... attributeN="N value">
<an_element2 attribute1="some value" attribute2="other value" ... attributeN="N value">
...

我需要用以下的方式对其进行转换:

<an_element1>
<attribute1>some value</attribute1>
<atttibute2>other value</attribute2>
...
<attributeN>N value</attributeN>
</an_element1>
<an_element2>
<attribute1>some value</attribute1>
<atttibute2>other value</attribute2>
...
<attributeN>N value</attributeN>
</an_element2>
...

我已经成功尝试了其他答案中的一些示例,但我想知道是否存在一种针对此问题的通用方法,可以这样总结:

对于名为an_element的每个元素,为每个包含各自值的属性创建一个子元素。

由于重复元素可能包含重复值(两个an_element项目的所有属性具有相同的值),我想知道是否可以仅过滤唯一元素。

如果可以使用过滤器,最好在转换之前或之后应用它?

1 个答案:

答案 0 :(得分:1)

  

对于名为an_element的每个元素,为每个包含各自值的属性创建一个子元素。

以下样式表将所有属性转换为类似命名的元素。从属性生成的元素将位于从源中的子元素复制的元素之前。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XST/Transform" version="1.0">
  <xsl:template match="@*">
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

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

如果您只想对具有特定名称的元素执行此操作,则需要更像

的内容
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XST/Transform" version="1.0">
  <xsl:template match="an_element/@*">
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

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

将转换

<an_element foo="bar"/>

<an_element>
  <foo>bar</foo>
</an_element>

但会保持<another_element attr="whatever"/>不变。