我正在尝试使用XSL转换XML文件,但无法弄清楚如何将元素重命名为其属性之一的名称或值。我已经找到了很多将属性转换为元素的例子,反之亦然,但我最后还是嵌套了我不想要的嵌套元素。这是一个例子:
原始XML:
<row_item column="Hostname">HOST-A</row_item>
<row_item column="IP Address">10.10.10.10</row_item>
我想输出的内容:
<column>HOST-A</column>
或(首选):
<hostname>HOST-A</hostname>
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="row_item[1]">
<xsl:element name="{@column}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于此XML文档时:
<rows>
<row_item column="Hostname">HOST-A</row_item>
<row_item column="IP Address">10.10.10.10</row_item>
</rows>
生成想要的正确结果:
<Hostname>HOST-A</Hostname>
<强>解释强>:
正确使用 xsl:element
和 AVT 。
答案 1 :(得分:1)
重命名文档中某些元素的最简单方法是使用标识转换,然后为要更改的元素添加一些模板。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- modify just the row_item with the specified attribute value -->
<xsl:template match="row_item[@column='Hostname']">
<hostname>
<xsl:apply-templates />
</hostname>
</xsl:template>
<!-- the identity template -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用
的xml示例<rows>
<row_item column="Hostname">HOST-A</row_item>
<row_item column="IP Address">10.10.10.10</row_item>
</rows>
转换为
<rows>
<hostname>HOST-A</hostname>
<row_item column="IP Address">10.10.10.10</row_item>
</rows>