2013-02-19 52 views
0

我想這個XML文檔轉換:XSLT:如何將字符串轉換爲多個元素?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
<data> 
    <entry> 
     <databit>30.11.2012</databit> 
     <databit>Foo</databit> 
     <databit>Key: Value<br />Key: Value<br /> ... Key: Value</databit> 
     <databit>some Foo content</databit> 
     <databit>more Foo content</databit> 
    </entry> 
    <entry> 
     ... 
    </entry> 
    ... 
</data> 

的鍵值對的數目是可變的。分隔符始終是<br />標籤。

輸出應該是這樣的:

<data> 
    <entry> 
     <date>30.11.2012</date> 
     <title>Foo</title> 
     <info> 
      <part key="Key" value="Value" /> 
      <part key="Key" value="Value" /> 
      <part key="Key" value="Value" /> 
     </info> 
     <databit>some Foo content</databit> 
     <databit>more Foo content</databit> 
    </entry> 
    <entry> 
     ... 
    </entry> 
    ... 
</data> 

這裏是我寫的XSLT文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <data> 
      <xsl:for-each select="/data/entry"> 
       <entry> 
        <date> 
         <xsl:value-of select="databit[1]"/> 
        </date> 
        <title> 
         <xsl:value-of select="databit[2]"/> 
        </title> 
        <info> 
         <xsl:value-of select="databit[3]"/> 
        </info> 
        <category> 
         <xsl:value-of select="databit[4]"/> 
        </category> 
        <status> 
         <xsl:value-of select="databit[5]"/> 
        </status> 
       </entry> 
      </xsl:for-each> 
     </data> 
    </xsl:template> 
</xsl:stylesheet> 

但我不知道,如何改造info

回答

2

此樣式表應創建所需的轉換。樣式表假設鍵和值總是用:分開,它除去冒號和空格字符,但不包含其他字符。如果需要刪除空格,請使用normalize-space()

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

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

    <xsl:template match="databit[1]"> 
     <date> 
      <xsl:apply-templates/> 
     </date> 
    </xsl:template> 

    <xsl:template match="databit[2]"> 
     <title> 
      <xsl:apply-templates/> 
     </title> 
    </xsl:template> 

    <xsl:template match="databit[3]"> 
     <info> 
      <xsl:apply-templates/> 
     </info> 
    </xsl:template> 

    <xsl:template match="databit[3]/text()"> 
     <part key="{substring-before(., ':')}" value="{substring(substring-after(., ':'), 2)}"/> 
    </xsl:template> 

    <xsl:template match="databit[3]/br"/> 

</xsl:stylesheet> 

  • 所有元素都通過使用身份模板,除非元素都有自己的
  • 所有文本節點在第三<databit>元素的模板遞歸複製的樣式表的幾點預期是鍵值對。
  • 使用括號內的XPath表達式(屬性值模板)添加<part>元素中的屬性。其他添加方法是使用<xsl:attribute>元素。
  • 元素<br>被禁止通過使用空模板進行復制。
+0

非常感謝! – automatix 2013-02-20 00:05:36