2015-12-06 123 views
0

反正轉換爲XML,使每一個元素中的值將成爲該元素如轉換XML值屬性

<example> 
    <abc>12</abc> 
    <def>hello</def> 
</example> 

的屬性變爲:

<example> 
    <abc val=12/> 
    <def val=hello/> 
</example> 

,但一切留在相同

對不起,忘了說,我會理想喜歡一個腳本,實現這一點,無論你給它什麼XML。

+0

XML是一種**非常靈活的格式,可以有多種變體。當您要求進行轉換時,「*無論您給出哪種xml都能實現此轉換*」,您需要提供更多規則來處理這些變體。例如,一個元素可能已經有一個名爲'val'的屬性。或者它可能有混合內容。混合內容可能有多個文本節點。 –

+0

是的,我的歉意,我的意思是任何XML文件,可以有任何元素,但這些元素都沒有屬性,但有一些確實有價值。 – bdanger

回答

1

類似的東西應該工作:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="example"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="example/*"> 

    <xsl:element name="{name()}"> 
      <xsl:attribute name="val"><xsl:value-of select="."/></xsl:attribute> 
     </xsl:element> 
    </xsl:template> 

</xsl:transform> 

但是,根據你的現實生活中的投入結構,則可能需要更改模板選擇。

0

編寫模板

<xsl:template match="example/*[not(*)]"> 
    <xsl:element name="{name()}" namespace="{namespace-uri()}"> 
    <xsl:attribute name="val" select="."/> 
    </xsl:element> 
</xsl:template> 

加當然

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

的身份轉換模板如果你想沒有任何的子元素的所有元素轉換的格式<foo val="..."/>然後更改模板匹配模式從<xsl:template match="example/*[not(*)]"><xsl:template match="*[not(*)]">。另請注意,我使用XSLT 2.0語法<xsl:attribute name="val" select="."/>,並且需要使用XSLT 1.0處理器<xsl:attribute name="val"><xsl:value-of select="."/></xsl:attribute>

對於任何類型的XML文檔都有一個工作方法,那麼,如果你有<foo><bar><baz>foobar</baz></bar><bar>value</bar></foo>,那麼簡單的方法會拋出一個錯誤,因爲在創建子元素後會創建屬性。您不清楚您想要哪個結果順序,因此您需要編輯您的問題並向我們展示可能的輸入和想要的結果樣本的更多詳細信息。

+0

我會匹配沒有任何子元素''not(*)''example'元素的所有子元素('*')。 –