2012-02-03 57 views
2

我想使用XSL來轉換XML文件,並且無法弄清楚如何將元素重命名爲其屬性的名稱或值之一。我已經找到了很多將屬性轉換爲元素的例子,而其他的方式卻一直存在,但我總是以嵌套的元素結尾,而這些元素是我不想要的。這裏有一個例子:基於屬性的XSL重命名元素

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

你能解釋清楚一點嗎?輸出XML中的元素名稱是否爲動態?如果是這樣,它是基於'column'屬性值嗎?第二個'row_item'呢? – 2012-02-03 13:58:39

回答

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

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> 

隨着

<rows> 
    <row_item column="Hostname">HOST-A</row_item> 
    <row_item column="IP Address">10.10.10.10</row_item> 
</rows> 

一個示例XML這種轉變爲

<rows> 
    <hostname>HOST-A</hostname> 
    <row_item column="IP Address">10.10.10.10</row_item> 
</rows>