我有一些看起来像这样的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项目的所有属性具有相同的值),我想知道是否可以仅过滤唯一元素。
如果可以使用过滤器,最好在转换之前或之后应用它?
答案 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"/>
不变。