2013-02-20 83 views
3

由於XML片段:如何使用XSLT將XML元素名稱轉換爲屬性值?

<transactions> 
    <tran id="1"> 
    <E8> 
     <datestamp>2012-05-17T15:16:57Z</datestamp> 
    </E8> 
    </tran> 
</transactions> 

如何使用XSLT轉換我的元素<E8><event type="E8">

編輯:預期輸出:

<transactions> 
    <tran id="1"> 
    <event type="E8"> 
     <datestamp>2012-05-17T15:16:57Z</datestamp> 
    </event> 
    </tran> 
</transactions> 

回答

2

用途:

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

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

    <xsl:template match="tran/*"> 
    <event type="{name()}"> 
     <xsl:value-of select="."/> 

    </event> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

<transactions> 
    <tran id="1"> 
    <event type="E8">2012-05-17T15:16:57Z</event> 
    </tran> 
</transactions> 
+0

謝謝,回答我的問題,但它不太輸出I期待(見編輯)。我仍然需要保留E8元素的所有子元素(可以有多個)。對不起,不澄清。 – 2013-02-20 02:43:31

+0

我想通了。使用''而不是'' – 2013-02-20 02:47:06

+3

@JordanDedels,實際上,使用'xsl:copy- 「不是最好的解決方案 - 如果將來你需要改造這些孩子,那麼你將不得不刪除這條指令。 – 2013-02-20 02:52:51

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="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="tran/E8"> 
    <event type="E8"> 
    <xsl:apply-templates/> 
    </event> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<transactions> 
    <tran id="1"> 
    <E8> 
     <datestamp>2012-05-17T15:16:57Z</datestamp> 
    </E8> 
    </tran> 
</transactions> 

產生想要的,正確的結果:

<transactions> 
    <tran id="1"> 
     <event type="E8"> 
     <datestamp>2012-05-17T15:16:57Z</datestamp> 
     </event> 
    </tran> 
</transactions> 
相關問題