0

入力 XML :

<Root>
    <RootHeader>Header</RootHeader>
    <Reference>
        <name>RefName</name>
        <value>Header001</value>
    </Reference>

    <NodeNumber>1</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <NodeNumber>2</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>101</value>
    </Reference>

    <NodeNumber>3</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>101</value>
    </Reference>

    <NodeNumber>4</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <NodeNumber>5</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>102</value>
    </Reference>
</Root>

期待される出力:

<Root>
    <RootHeader>Header</RootHeader>
    <Reference>
        <name>RefName</name>
        <value>Header001</value>
    </Reference>

    <GroupingSequenceNumber>1</GroupingSequenceNumber>
    <NodeNumber>1</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <GroupingSequenceNumber>1</GroupingSequenceNumber>
    <NodeNumber>2</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>101</value>
    </Reference>

    <GroupingSequenceNumber>2</GroupingSequenceNumber>
    <NodeNumber>3</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <GroupingSequenceNumber>3</GroupingSequenceNumber>
    <NodeNumber>4</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <GroupingSequenceNumber>1</GroupingSequenceNumber>
    <NodeNumber>5</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>102</value>
    </Reference>
</Root>

ルート/参照/値に基づいてグループ化を行い、出力にグループ化シーケンス番号を追加する方法は?

グループ化では、ヘッダー内の参照を除外する必要があります。NodeNumber の発生後にグループ化を開始する必要があることを意味します。

前もって感謝します。

4

2 に答える 2

1

これは、xslt 1.0 での xml ノードのグループ化に関する以前の質問と非常によく似ています。

ただし、この場合は、NodeNumber要素を照合し、 Reference要素に続く値を見てカウントする必要があります。

<xsl:variable name="Ref" select="following-sibling::Reference[1]/value"/>
<GroupingSequenceNumber>
   <xsl:number count="NodeNumber[following-sibling::Reference[1]/value = $Ref]"/>
</GroupingSequenceNumber>

ここに完全な XSLT があります

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

   <xsl:template match="NodeNumber">
      <xsl:variable name="Ref" select="following-sibling::Reference[1]/value"/>
      <GroupingSequenceNumber>
         <xsl:number count="NodeNumber[following-sibling::Reference[1]/value = $Ref]"/>
      </GroupingSequenceNumber>
      <xsl:copy-of select="."/>
   </xsl:template>

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

サンプル入力ドキュメントに適用すると、以下が出力されます

<Root>
   <RootHeader>Header</RootHeader>
   <Reference>
      <name>RefName</name>
      <value>Header001</value>
   </Reference>
   <GroupingSequenceNumber>1</GroupingSequenceNumber>
   <NodeNumber>1</NodeNumber>
   <Reference>
      <name>RefName</name>
      <value>100</value>
   </Reference>
   <GroupingSequenceNumber>1</GroupingSequenceNumber>
   <NodeNumber>2</NodeNumber>
   <Reference>
      <name>RefName</name>
      <value>101</value>
   </Reference>
   <GroupingSequenceNumber>2</GroupingSequenceNumber>
   <NodeNumber>3</NodeNumber>
   <Reference>
      <name>RefName</name>
      <value>101</value>
   </Reference>
   <GroupingSequenceNumber>2</GroupingSequenceNumber>
   <NodeNumber>4</NodeNumber>
   <Reference>
      <name>RefName</name>
      <value>100</value>
   </Reference>
   <GroupingSequenceNumber>1</GroupingSequenceNumber>
   <NodeNumber>5</NodeNumber>
   <Reference>
      <name>RefName</name>
      <value>102</value>
   </Reference>
</Root>
于 2012-09-11T08:03:56.700 に答える
1

この XSLT 1.0 スタイルシート...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

<xsl:key name="kRefs" match="Reference[preceding-sibling::NodeNumber]" use="value" />

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

<xsl:template match="/*">
  <xsl:copy>
    <xsl:apply-templates select="
      @* | node()[not(self::Reference[preceding-sibling::NodeNumber])][not(self::NodeNumber)]" />
    <xsl:for-each select="
        Reference[preceding-sibling::NodeNumber]
                 [generate-id() = generate-id(key('kRefs',value)[1])]">
       <xsl:comment>Start of group for value <xsl:value-of select="value" /></xsl:comment> 
       <xsl:apply-templates select="key('kRefs',value)" />            
       <xsl:comment>End of group</xsl:comment>   
    </xsl:for-each>               
  </xsl:copy>
</xsl:template>

<xsl:template match="Reference[preceding-sibling::NodeNumber]" >
  <GroupingSequenceNumber><xsl:value-of select="position()" /></GroupingSequenceNumber>
  <xsl:copy-of select=".|preceding-sibling::NodeNumber[1]" />
</xsl:template>

</xsl:stylesheet>

...この入力に適用すると...

<Root>
    <RootHeader>Header</RootHeader>
    <Reference>
        <name>RefName</name>
        <value>Header001</value>
    </Reference>

    <NodeNumber>1</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <NodeNumber>2</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>101</value>
    </Reference>

    <NodeNumber>3</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>101</value>
    </Reference>

    <NodeNumber>4</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>100</value>
    </Reference>

    <NodeNumber>5</NodeNumber>
    <Reference>
        <name>RefName</name>
        <value>102</value>
    </Reference>
</Root> 

...収量...

<Root>
  <RootHeader>Header</RootHeader>
  <Reference>
    <name>RefName</name>
    <value>Header001</value>
  </Reference>
  <!--Start of group for value 100-->
  <GroupingSequenceNumber>1</GroupingSequenceNumber>
  <NodeNumber>1</NodeNumber>
  <Reference>
    <name>RefName</name>
    <value>100</value>
  </Reference>
  <GroupingSequenceNumber>2</GroupingSequenceNumber>
  <NodeNumber>4</NodeNumber>
  <Reference>
    <name>RefName</name>
    <value>100</value>
  </Reference>
  <!--End of group-->
  <!--Start of group for value 101-->
  <GroupingSequenceNumber>1</GroupingSequenceNumber>
  <NodeNumber>2</NodeNumber>
  <Reference>
    <name>RefName</name>
    <value>101</value>
  </Reference>
  <GroupingSequenceNumber>2</GroupingSequenceNumber>
  <NodeNumber>3</NodeNumber>
  <Reference>
    <name>RefName</name>
    <value>101</value>
  </Reference>
  <!--End of group-->
  <!--Start of group for value 102-->
  <GroupingSequenceNumber>1</GroupingSequenceNumber>
  <NodeNumber>5</NodeNumber>
  <Reference>
    <name>RefName</name>
    <value>102</value>
  </Reference>
  <!--End of group-->
</Root>
于 2012-09-11T07:54:44.600 に答える