2016-10-10 57 views
1

我有XML,我需要轉換爲更簡化的格式。我確信這可以用XSLT完成,但我不確定如何。在輸出元素名稱是動態的地方轉換XML?

我需要轉換:

<Fields> 
    <Field> 
    <Name>Element1</Name> 
    <Value>Value 1</Value> 
    </Field> 
    <Field> 
    <Name>Element2</Name> 
    <Value>Value 2</Value> 
    </Field> 
</Fields> 

<Fields> 
    <Element1>Value 1</Element1> 
    <Element2>Value 2</Element2> 
</Fields> 

這是我目前:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:copy-of select="Fields/Field/*"/> 
     <xsl:apply-templates select="*[name()]"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

回答

1

您輸入XML,

<Fields> 
    <Field> 
    <Name>Element1</Name> 
    <Value>Value 1</Value> 
    </Field> 
    <Field> 
    <Name>Element2</Name> 
    <Value>Value 2</Value> 
    </Field> 
</Fields> 

通過該XSLT轉換,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Fields"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Field"> 
    <xsl:element name="{Name}"> 
     <xsl:value-of select="Value"/> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

產生這個輸出XML,

<?xml version="1.0" encoding="UTF-8"?> 
<Fields> 
    <Element1>Value 1</Element1> 
    <Element2>Value 2</Element2> 
</Fields> 

的要求。

+1

*重要*注意:有有效的xml元素名稱的規則。 (1)姓名不得以數字開頭。 (2)名稱不能以特殊字符(如連字符或句點)開頭。 (3)名稱不能包含除句點,連字符,下劃線和冒號以外的特殊字符。 – uL1

+0

您可以使用雙翻譯方法 - '來防止無效名稱, $ validChars'是一個變量,它包含您想要在名稱中允許的所有字符。這雖然有點粗糙。 – Flynn1179