基于属性重命名元素的XSL



我正在尝试使用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:elementAVT

重命名文档中某些元素的最简单方法是使用标识转换,然后为要更改的元素添加一些模板。

<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>

相关内容

  • 没有找到相关文章

最新更新