2013-02-19 55 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