XSL根据属性重命名元素

时间:2012-02-03 13:52:34

标签: xml xslt

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

2 个答案:

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