2017-09-14 17 views
0

xmlをcsvに変換するには、XSLTファイルを使用する必要があります。それは十分簡単です。XSLTは別個のノードをカウントする

また、ノードから別の値を数え、それを各行に挿入する必要があります。これは私が何をすべきかわからない場所です。

私があなたを数える必要があるノードは下の例で見ることができます。それは< Id>と呼ばれます。

私は基本的に一意であるすべてのIDを数え、結果を各注文線に挿入したいと考えています。

私の例ので>値1と一つ< IDと値4を有するノード2つ< ID>ノードが、結果は全く助けを事前に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

? –

+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ソリューション:XSLTプロセッサが使用する予定の

<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>