根据输入中元素的出现增加输出中的元素值

时间:2017-12-13 02:20:27

标签: xml xslt position xslt-2.0 xpath-2.0

您好我正在尝试编写xslt,当给出下面的类似输入时,我需要获得所需的输出。如果您观察到输出具有基于该xml中元素出现的id。到目前为止,在我的xslt中,我根据位置做了这件事。但它打破并重新启动输入XML中的每一个计数。这可以实现吗。

更新

在输入中添加更多细节。如你所见,我在水平下添加,应该填充所有相应的数据

输入XML

<lines>
    <line>
      <po-num>text1</ponum>
        <accountings>
            <accounting>
                <account>
                    <seg1>value1</seg1>
                </account>
            </accounting>
            <accounting>
                <account>
                    <seg1>value2</seg1>
                </account>
            </accounting>
        </accountings>
    </line>
    <line>
       <po-num>text2</ponum>
        <accountings>
            <accounting>
                <account>
                    <seg1>value3</seg1>
                </account>
            </accounting>
        </accountings>
    </line>
    <line>
       <po-num>text3</ponum>
        <account>
            <seg1>value4</seg1>
        </account>
    </line>
</lines>

所需的输出XML

<Item>
    <id>1</id>
    <po-num>text1</ponum>
    <seg>value1</seg>
</Item>
<Item>
    <id>2</id>
    <po-num>text1</ponum>
    <seg>value2</seg>
</Item>
<Item>
    <id>3</id>
    <po-num>text2</ponum>
    <seg>value3</seg>
</Item>
<Item>
    <id>4</id>
     <po-num>text3</ponum>
    <seg>value4</seg>
</Item>

XSLT 我正在使用Rupesh提供的xslt。

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

    <xsl:for-each select="//account">
        <item>
            <id><xsl:value-of select="position()"/></id>
             <po-num><xsl:value-of select="../../../*:po-num"/></po-num>
            <seg><xsl:value-of select="./*:seg1"></xsl:value-of></seg>
        </item>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:3)

试试这个:

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

        <xsl:for-each select="//seg1">
            <item>
                <id><xsl:value-of select="position()"/></id>
                <seg><xsl:value-of select="."></xsl:value-of></seg>
            </item>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

您可以在http://xsltransform.hikmatu.com/jyyiVhm

看到转型