2017-09-14 50 views
0

我需要使用XSLT文件將xml轉換爲csv。這很容易。XSLT統計不同的節點

我還需要從一個節點中計算不同的值並將它們插入到每一行中。這在哪裏我不知道該怎麼做。

我需要計算的節點可以在下面的示例中看到。它被稱爲< Id>。

我基本上想要統計所有唯一的id,並將結果插入到每個命令行中。

由於我的例子有兩個< ID>具有值1和一個< ID>具有值4的節點,其結果將是2.

預先感謝任何幫助在所有節點。

XML:

<?xml version="1.0" encoding="utf-8"?> 
<Picked xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <OrderLines> 
     <OrderLine> 
      <OrderId>1345 
      </OrderId> 
      <Missions> 
       <Mission> 
        <ContainerIds> 
         <Container> 
          <Id>1 
          </Id> 
         </Container> 
        </ContainerIds> 
       </Mission> 
      </Missions> 
     </OrderLine> 
     <OrderLine> 
      <OrderId>13456 
      </OrderId> 
      <Missions> 
       <Mission> 
        <ContainerIds> 
         <Container> 
          <Id>1 
          </Id> 
         </Container> 
        </ContainerIds> 
       </Mission> 
      </Missions> 
     </OrderLine> 
     <OrderLine> 
      <OrderId>134567 
      </OrderId> 
      <Missions> 
       <Mission> 
        <ContainerIds> 
         <Container> 
          <Id>4 
          </Id> 
         </Container> 
        </ContainerIds> 
       </Mission> 
      </Missions> 
     </OrderLine> 
    </OrderLines> 
</Picked> 

期望的結果:

Orderid;Id 
    1345;2 
    13456;2 
    134567;2 

XSLT至今:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="text" encoding="UTF-8"/> 
    <xsl:template match='/'> 

    <xsl:text>Orderid;Id</xsl:text> 
    <xsl:text>&#10;</xsl:text> 

    <xsl:for-each select="/Picked/OrderLines/OrderLine"> 
     <xsl:value-of select="OrderId"/> 
     <xsl:text>;</xsl:text> 
     <xsl:value-of select="Missions/Mission/ContainerIds/Container/Id"/>       
     <xsl:if test="position()!=last()"> 
     <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

我的結果至今:

Orderid;Id 
    1345;1 
    13456;1 
    134567;4 
+0

哪個XSLT處理器將您使用? –

+0

我將使用XSLT 1.0 – stianzz

+0

但是具體哪個處理器?有些支持'distinct()'擴展功能。 –

回答

1

XSLT-1.0有幾種可能性來獲取不同的值。它們在this good SO answer中列舉。

我使用了Nick Grealy的方法,避免使用generate-id(),並計算得到的節點。

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:text>Orderid;Id</xsl:text> 
     <xsl:text>&#10;</xsl:text> 
     <xsl:for-each select="/Picked/OrderLines/OrderLine"> 
      <xsl:value-of select="OrderId"/> 
      <xsl:text>;</xsl:text> 
      <xsl:value-of select="count(//Id[not(.=preceding::*)])"/> <!-- count above all Id's in document --> 
      <xsl:if test="position()!=last()"> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

Orderid;Id 
1345;2 
13456;2 
134567;2 
+0

謂詞'[generate-id()= key('unique',。)]'看起來不對...... –

+0

@MichaelKay:謝謝。我完全刪除了該行 - 以前版本的不必要的其餘部分。 – zx485

+0

「*避免使用generate-id()*」爲什麼這是件好事?在這裏閱讀爲什麼它不是:http://www.jenitennison.com/xslt/grouping/muenchian.html –

2

XSLT 3.0進行比較的解決方案:

<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    expand-text="yes"> 

    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:text>Orderid;Id&#10;</xsl:text> 
     <xsl:for-each select="/Picked/OrderLines/OrderLine"> 
      <xsl:text>{OrderId};{count(distinct-values(//Id))}&#10;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet>