2011-03-09 38 views
1

我有一個關於xslt的可能性的問題。可以用xslt完成下面的工作嗎?XSLT 1.0:不能在for-each中使用變量,還有其他方法可以解決這個例子嗎?

輸入:`

<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

怎麼樣只是使用的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> 
+0

因人而異,如果我能相信這個博客帖子:使用XPath的「前同輩」正確軸(http://www.infopathdev.com/blogs/greg/archive/ 2005/06/13 /使用-XPath_2700_s-_2700_preceding_2D00_sibling_2700_軸Correctly.aspx) – mousio 2011-03-10 11:09:08