XSLT 1.0:不能在for-each中使用变量,有没有其他方法可以解决这个例子?

时间:2011-03-09 20:34:46

标签: xslt-1.0

我对xslt的可能性有疑问。可以用xslt完成吗?

输入:`

<invoice>
<record><field>ROWORD;123;;;</field></record>
<record><field>ROWART;shoe;10,2;20;</field></record>
<record><field>ROWORD;124;;;</field></record>
<record><field>ROWART;ball;1,5;2;</field></record>
<record><field>ROWART;car;1000;1;</field></record>
<record><field>ROWART;tractor;900;2;</field></record>
<record><field>ROWORD;125;;;</field></record>
<record><field>ROWART;computer;100;200;</field></record>
<record><field>ROWART;shoes;10,2;20;</field></record>
<record><field>ROWORD;126;;;</field></record>
<record><field>ROWART;keyboard;100;1;</field></record>
</invoice>
输出应该是:

<article>
<description>shoe</description>
<price>10,2</price>
<ordernumber>123</ordernumber>

<article>
<description>ball</description>
<price>1,5</price>
<ordernumber>124</ordernumber>

<article>
<description>car</description>
<price>1000</price>
<ordernumber>124</ordernumber>

<article>
<description>tractor</description>
<price>900</price>
<ordernumber>124</ordernumber>

<article>
<description>computer</description>
<price>100</price>
<ordernumber>125</ordernumber>

<article>
<description>shoe</description>
<price>10,2</price>
<ordernumber>125</ordernumber>

<article>
<description>keyboard</description>
<price>100</price>
<ordernumber>126</ordernumber>

我使用for-each循环记录。然后我将标记字段拆分为单独的变量(使用substring-before / substring-after)。使用if语句,我检查标签字段是否以ROWART开头,但后来我遇到了问题。我找不到找到响应订单号的方法。

所以,我正在寻找一种记住ROWORD的方法。

我的使用xslt的想法可能有问题。 我使用xslt 1.0。输入无法更改。

感谢您的帮助 奥利弗

1 个答案:

答案 0 :(得分:1)

如何在ROWART项目上使用for-each,然后使用前面的兄弟:: ... ROWORD获取所需的额外数据?

像这样:

<xsl:for-each select="//field[starts-with(text(),'ROWART')]">
    <article>
        <description>
            <xsl:value-of select="substring-before(substring-after(text(),';'),';')"/>
        </description>
        <price>
            <xsl:value-of select="substring-before(substring-after(substring-after(text(),';'),';'),';')"/>
        </price>
        <ordernumber>
            <xsl:variable name="ROWORDfields" select="../preceding-sibling::*[starts-with(field/text(),'ROWORD')]"/>
            <xsl:value-of select="substring-before(substring-after($ROWORDfields[last()],';'),';')"/>
        </ordernumber>
    </article>
</xsl:for-each>