使用XSLT转换XML

时间:2017-10-16 16:14:54

标签: xml xslt

我有以下设置的XML内容(基本上,多行包含三个项

  • )我想要转换如下: 而不是:

    <line><li>1</li><li>2</li><li>3</li></line>
    <line><li>a</li><li>b</li><li>c</li></line>
    <line><li>x</li><li>y</li><li>z</li></line>
    

    我想:

    <line>
    <item1>col1<item1><li>1</li>
    <item2>col2<item1><li>2</li>
    <item3>col3<item1><li>3</li>
    </line>
    <line>
    <item1>col1<item1><li>a</li>
    <item2>col2<item1><li>b</li>
    <item3>col3<item1><li>c</li>
    </line>
    <line>
    <item1>col1<item1><li>x</li>
    <item2>col2<item1><li>y</li>
    <item3>col3<item1><li>z</li>
    </line>
    

    基本上为ech线添加一列。 XSLT有助于实现这一结果吗? 非常感谢。

  • 1 个答案:

    答案 0 :(得分:0)

    我尝试了一个略微修改过的版本。我的输入XML是:

    <message>
    <line number="1"><li>1</li><li>2</li><li>3</li></line>
    <line number="2"><li>x</li><li>y</li><li>z</li>
    </line>
    <line number="3"><li>a</li><li>b</li><li>c</li>
    </line>
    </message>
    

    我的XSLT是:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
      <xsl:for-each select="/message/line">
    
    number: <xsl:value-of select="@number"/>
    position: <xsl:value-of select="position()"/>
    all items: <xsl:value-of select="."/>
    item[3]: <xsl:value-of select="li[3]"/>
    
      </xsl:for-each>
    </xsl:template>
    

    这会产生:

    number: 1
    position: 1
    all items: 123
    item[3]: 3
    
    number: 2
    position: 2
    all items: xyz
    item[3]: z
    
    number: 3
    position: 3
    all items: abc
    item[3]: c
    

    我最初的想法是将所有项目放在变量中,然后对该变量执行第二次嵌套for-each。但它产生的是123(第一行),省略了

  • 标签。有趣的是,当我在消息上尝试使用以下XPath时:

    /message/line[1]/li
    

    我获得:

    <li>1</li>
    <li>2</li>
    <li>3</li>
    

    这是期望的结果。 在我的XSLT中,我尝试用“select =”li [position()]“”替换“select =”。“”但它只会返回每行的第1项。

    是否有任何解释,我应该更改什么以获得与我的xPath相同的结果?