XSLT 1.0: нельзя использовать переменную в for-each, есть ли другой способ решить этот пример? - PullRequest
1 голос
/ 09 марта 2011

У меня вопрос о возможностях 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>

Я использовалдля каждого, чтобы перебрать записи.Затем я разделяю поле тега на отдельные переменные (с помощью substring-before / substring-after).С помощью оператора if я проверяю, начинается ли поле тега с ROWART, но тогда у меня есть проблема.Я не могу найти способ найти отвечающий порядковый номер.

Итак, я ищу способ запомнить ROWORD.

Возможно, что-то не так с моей идеей использования xslt.Я использую xslt 1.0.Ввод не может быть изменен.

Спасибо за вашу помощь, Оливье

1 Ответ

1 голос
/ 10 марта 2011

Как насчет использования for-each для элементов ROWART, а затем предшествующего родного элемента ::… 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>
...