2013-01-18 53 views
1

我有一個數據集(我無法控制),它有一個簡單的鍵值結構。如果一個表中填充具有n行的輸出的樣本是:使用XSLT轉換「編號」鍵值XML元素

<property> 
    <name>Row1_Field1</name> 
    <value>Data Value Sample</value> 
</property> 
<property> 
    <name>Row1_Field2</name> 
    <value>Data Value Sample</value> 
</property> 
<property> 
    <name>Row2_Field1</name> 
    <value>Data Value Sample</value> 
</property> 
<property> 
    <name>Row2_Field2</name> 
    <value>Data Value Sample</value> 
</property> 

是否有可能,使用XSLT,將其轉換成一些比較容易的工作,如下面的例子嗎?

<rows> 
    <row> 
    <Field1>Data Value Sample</Field1> 
    <Field2>Data Value Sample</Field2> 
    </row> 
    <row> 
    <Field1>Data Value Sample</Field1> 
    <Field2>Data Value Sample</Field2> 
    </row> 
</rows> 
+0

你能在這裏使用XSLT2.0嗎? –

回答

2

這種轉變:

<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="/*"> 
    <rows> 
     <xsl:apply-templates/> 
    </rows> 
</xsl:template> 

<xsl:template match= 
    "property[not(substring-before(name,'_') 
       = 
       substring-before(preceding-sibling::*[1]/name,'_'))]"> 
    <row> 
    <xsl:apply-templates mode="inRow" select= 
    "/*/property[substring-before(name,'_') = substring-before(current(),'_')]"/> 
    </row> 
</xsl:template> 

<xsl:template match="property" mode="inRow"> 
    <xsl:element name="{substring-after(name,'_')}"><xsl:value-of select="value"/></xsl:element> 
</xsl:template> 
<xsl:template match="property"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<properties> 
    <property> 
     <name>Row1_Field1</name> 
     <value>Data Value Sample</value> 
    </property> 
    <property> 
     <name>Row1_Field2</name> 
     <value>Data Value Sample</value> 
    </property> 
    <property> 
     <name>Row2_Field1</name> 
     <value>Data Value Sample</value> 
    </property> 
    <property> 
     <name>Row2_Field2</name> 
     <value>Data Value Sample</value> 
    </property> 
</properties> 

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

<rows> 
    <row> 
     <Field1>Data Value Sample</Field1> 
     <Field2>Data Value Sample</Field2> 
    </row> 
    <row> 
     <Field1>Data Value Sample</Field1> 
     <Field2>Data Value Sample</Field2> 
    </row> 
</rows> 
+0

完美地工作,謝謝! –

+0

@MichaelS,不客氣 –