2015-10-05 59 views
2

我試圖將XML文件看起來像這樣扁平化XML屬性和文本到同級元素

<?xml version="1.0" encoding="UTF-8"?> 
<Records xmlns="http://some.place.net"> 
    <Record> 
     <length unit="in">96</length> 
     <width unit="in">3.75</width> 
     <height unit="in">1.75</height> 
     <weight unit="lbs">8</weight> 
    </Record> 
</Records> 

到的東西,看起來像這樣

<?xml version="1.0" encoding="UTF-8"?> 
<Records xmlns="http://some.place.net"> 
    <Record> 
     <length>96</length> 
     <lengthunit>in</lengthunit> 
     <width>3.75</width> 
     <widthunit>in</widthunit> 
     <height>1.75</height> 
     <heightunit>in</heightunit> 
     <weight>8</weight> 
     <weightunit>lbs</weightunit> 
    </Record> 
</Records> 

我XLST樣式表看起來像這樣。我無法弄清楚如何讓新元素顯示爲前面元素的兄弟。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://www.something.com"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="vNamespace" select="namespace-uri(/*)"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@unit"> 
     <xsl:element name="{name(..)}{name()}" namespace="{$vNamespace}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 


</xsl:stylesheet> 

這就是我最終取而代之的。

<Records xmlns="http://some.place.net"> 
    <Record> 
    <length> 
     <lengthunit>in</lengthunit>96</length> 
    <width> 
     <widthunit>in</widthunit>3.75</width> 
    <height> 
     <heightunit>in</heightunit>1.75</height> 
    <weight> 
     <weightunit>lbs</weightunit>8</weight> 
    </Record> 
</Records> 
+2

分裂'的'移動' @ *'不在'xsl:copy'中。 – o11c

回答

0

如果選擇元素而不是屬性很簡單:

<xsl:template match="*[@unit]"> 
    <xsl:element name="{name()}" namespace="{$vNamespace}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    <xsl:element name="{name()}unit" namespace="{$vNamespace}"> 
     <xsl:value-of select="@unit"/> 
    </xsl:element> 
</xsl:template> 
+0

謝謝,這正是我一直在尋找的。所以匹配= * [@單位]將匹配任何具有名爲單位屬性的元素? – jjeff