我正在尝试使用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>
此转换:
<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。
重命名文档中某些元素的最简单方法是使用标识转换,然后为要更改的元素添加一些模板。
<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>