1

私は XSLT にかなり慣れていません。どんな助けでも大歓迎です....

<Test>
  <loop loop_id="5" LoopElementOrder_no="1" Segment_id="3" >
     <usage_id>1</usage_id>
    <value>41</value>
  </loop>
  <loop loop_id="5" LoopElementOrder_no="2"  Segment_id="3">
    <usage_id>1</usage_id>
     <value>2</value>
      </loop>
  <loop loop_id="5" LoopElementOrder_no="4" Segment_id="3">
     <usage_id>2</usage_id>
     <value>raj</value>
      </loop>
  <loop loop_id="5" LoopElementOrder_no="5" Segment_id="3">
     <usage_id>3</usage_id>
      <value>d</value>
    </loop>
  <loop loop_id="5"  LoopElementOrder_no="6" Segment_id="3">
    <usage_id>3</usage_id>  
      <value>8</value>
  </loop>
  <loop loop_id="5"  LoopElementOrder_no="7" Segment_id="3">
    <usage_id>3</usage_id>
      <value>7</value>
  </loop>
  <loop loop_id="5" LoopElementOrder_no="1" Segment_id="4">
       <usage_id>1</usage_id>

    <value>IC</value>
      </loop>
  <loop loop_id="5"  LoopElementOrder_no="2" Segment_id="4">
  <usage_id>2</usage_id>
      <value>d</value> 
  </loop>
 <loop loop_id="5"  LoopElementOrder_no="3" Segment_id="4">
      <usage_id>3</usage_id>
          <value>dm</value> 
      </loop> 
 <loop loop_id="5"  LoopElementOrder_no="4" Segment_id="4">
      <usage_id>2</usage_id>
          <value>wj</value> 
      </loop> 
    </Test>

usage_id が 1 または 2 の場合にのみ「値」を返したいと思います。usage_id が 3 の場合は、「N/A」を返す必要があります。ただし、たとえば、Segment_id=3 LoopElementOrder_no=5 にいる場合、Segment_id=3 の残りの部分には Usage_id が 1 または 2 として含まれていません。 =1。

上記の目的の出力は次のとおりです。

41 2 raj ^IC d N/A wj
4

2 に答える 2

0

完全に「プッシュ スタイル」である、より短く、より単純な (no xsl:apply-templates、 no xsl:variable、 no 、および no モードの 3 つのテンプレートのみ) より理解しやすいソリューション:current()

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

 <xsl:template match="loop[not(usage_id >2)]">
  <xsl:value-of select="concat(value, ' ')"/>
 </xsl:template>

 <xsl:template match=
 "loop[usage_id = 3
     and preceding-sibling::loop[not(usage_id >2)][1]/@Segment_id
        =following-sibling::loop[not(usage_id >2)][1]/@Segment_id
      ]
 ">N/A </xsl:template>

 <xsl:template match=
 "loop
   [usage_id >2
  and
    preceding-sibling::loop[1][not(usage_id >2)]
  and
    not(@Segment_id =following-sibling::loop[not(usage_id >2)][1]/@Segment_id)
    ]">^ </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Test>
  <loop loop_id="5" LoopElementOrder_no="1" Segment_id="3" >
     <usage_id>1</usage_id>
    <value>41</value>
  </loop>
  <loop loop_id="5" LoopElementOrder_no="2"  Segment_id="3">
    <usage_id>1</usage_id>
     <value>2</value>
      </loop>
  <loop loop_id="5" LoopElementOrder_no="4" Segment_id="3">
     <usage_id>2</usage_id>
     <value>raj</value>
      </loop>
  <loop loop_id="5" LoopElementOrder_no="5" Segment_id="3">
     <usage_id>3</usage_id>
      <value>d</value>
    </loop>
  <loop loop_id="5"  LoopElementOrder_no="6" Segment_id="3">
    <usage_id>3</usage_id>
      <value>8</value>
  </loop>
  <loop loop_id="5"  LoopElementOrder_no="7" Segment_id="3">
    <usage_id>3</usage_id>
      <value>7</value>
  </loop>
  <loop loop_id="5" LoopElementOrder_no="1" Segment_id="4">
       <usage_id>1</usage_id>

    <value>IC</value>
      </loop>
  <loop loop_id="5"  LoopElementOrder_no="2" Segment_id="4">
  <usage_id>2</usage_id>
      <value>d</value>
  </loop>
 <loop loop_id="5"  LoopElementOrder_no="3" Segment_id="4">
      <usage_id>3</usage_id>
          <value>dm</value>
      </loop>
 <loop loop_id="5"  LoopElementOrder_no="4" Segment_id="4">
      <usage_id>2</usage_id>
          <value>wj</value>
      </loop>
</Test>

必要な正しい結果が生成されます。

41 2 raj ^ IC d N/A wj

更新

ソリューションは、さらに短縮および簡素化できます。

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

 <xsl:template match="loop[not(usage_id >2)]">
   <xsl:if test=
   "preceding-sibling::loop[not(usage_id >2)][1]
      [not(@Segment_id = current()/@Segment_id)]">^ </xsl:if>
   <xsl:value-of select="concat(value, ' ')"/>
 </xsl:template>

 <xsl:template match=
 "loop[usage_id = 3
     and preceding-sibling::loop[not(usage_id >2)][1]/@Segment_id
        =following-sibling::loop[not(usage_id >2)][1]/@Segment_id
      ]
 ">N/A </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>
于 2013-04-06T18:36:40.623 に答える