2011-05-19 59 views
1

我想問如何在從另一個xml文件複製模板時如何重新計算行號位置和其他數據,如果滿足條件代碼應該與lookup.xml中的代碼相同。如何在重新計算位置時複製模板

我的節目看起來像:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Line-Item[code = document('lookup.xml')/*/*/code]" /> 
    <xsl:template match="Line[not(Line-Item/code[not(. = document('lookup.xml')/*/*/code) ])]"/> 
</xsl:stylesheet> 

XML文件:

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
    <Line> 
     <Line-Item> 
      <lineNumb>1</lineNumb> 
      <code>123</code> 
      <amount>4</amount> 
     </Line-Item> 
     <Line-Item> 
      <lineNumb>2</lineNumb> 
      <code>444</code> 
      <amount>2</amount> 
     </Line-Item> 
     <Line-Item> 
      <lineNumb>3</lineNumb> 
      <code>321</code> 
      <amount>1</amount> 
     </Line-Item> 
    </Line> 
    <summary> 
     <total-line>3</total-line> 
     <total-amount>7</total-amount> 
    </summary> 
</document> 

Lookup.xml文件:

<lookup> 
    <Codes> 
     <code>123</code> 
    </Codes> 
</lookup> 

我需要行項目重新計算lineNumb和彙總有總額和總額。

正確的結果:

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
    <Line> 
     <Line-Item> 
      <lineNumb>1</lineNumb> 
      <code>444</code> 
      <amount>2</amount> 
     </Line-Item> 
     <Line-Item> 
      <lineNumb>2</lineNumb> 
      <code>321</code> 
      <amount>1</amount> 
     </Line-Item> 
    </Line> 
    <summary> 
     <total-line>2</total-line> 
     <total-amount>3</total-amount> 
    </summary> 
</document> 

回答

1

你的工作幾乎已經完成。您只需要XPath count()sum()。要重新計算lineNumb,我已經計算了所有以前的兄弟元素,但匹配查找代碼的元素。

我認爲這應該在你的假設基礎上正常工作。


XSLT 1.0撒克遜-B 9.0.0.4J

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Line"> 

     <xsl:copy> 
      <xsl:apply-templates select="Line-Item"/> 
     </xsl:copy> 

     <xsl:variable name="lines" select="count(Line-Item[not(code = document('lookup.xml')/*/*/code)])"/> 
     <xsl:variable name="amount" select="sum(Line-Item[not(code = document('lookup.xml')/*/*/code)]/amount)"/> 

     <summary> 
      <total-line><xsl:value-of select="$lines"/></total-line> 
      <total-amount><xsl:value-of select="$amount"/></total-amount> 
     </summary> 
    </xsl:template> 

    <xsl:template match="Line-Item"> 
     <xsl:copy> 
      <lineNumb> 
       <xsl:value-of select="count(preceding-sibling::*[not(code = document('lookup.xml')/*/*/code)])+1"/> 
      </lineNumb> 
      <xsl:copy-of select="code"/> 
      <xsl:copy-of select="amount"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Line-Item[code = document('lookup.xml')/*/*/code]|summary" /> 

</xsl:stylesheet> 
+0

您好測試,但lineNumb不重新計算。我的意思是lineNumb的位置= 2和3,那麼應該是1和2,因爲我們先刪除。 – Petras 2011-05-19 16:03:36

+0

對不起,沒有看到特別的:)。我會盡快嘗試。 – 2011-05-19 16:51:15

+0

答案現在包括'lineNumb'重新計算。希望這是你需要的。 – 2011-05-19 18:28:51