XSLT: ส่งกลับผลลัพธ์ตามค่าพี่น้องต่อไปนี้

ฉันค่อนข้างใหม่กับ 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>

ฉันต้องการส่งคืน 'ค่า' เฉพาะในกรณีที่การใช้งาน_idเป็น 1 หรือ 2 ในกรณีที่การใช้งาน_idเป็น 3 ควรส่งคืน "N/A" อย่างไรก็ตาม ตัวอย่างเช่น หากฉันอยู่ใน Segment_id=3 LoopElementOrder_no=5 ส่วนที่เหลือของ Segment_id=3 จะไม่มีการใช้งานใด ๆ เป็น 1 หรือ 2 ซึ่งในกรณีนี้ฉันต้องส่งคืน "^" และดำเนินการต่อจาก Segment_id=4 ด้วย LoopElementOrder_no =1.

ผลลัพธ์ที่ต้องการสำหรับด้านบนคือ:

41 2 raj ^IC d N/A wj

person user2251759    schedule 06.04.2013    source แหล่งที่มา
comment
คุณสามารถแสดงตัวอย่างผลลัพธ์ที่คาดหวังของคุณในกรณีนี้ได้หรือไม่? ขอบคุณ!   -  person Tim C    schedule 06.04.2013
comment
ขอบคุณทิม นี่คือเอาต์พุตเดียวกันสำหรับกรณีด้านบน 41 2 raj ^IC d   -  person user2251759    schedule 06.04.2013
comment
คุณช่วยแสดงตัวอย่างอินพุตที่จะส่งผลให้มี N/A ในเอาต์พุตได้ไหม   -  person JLRishe    schedule 06.04.2013


คำตอบ (2)


วิธีที่สั้นกว่า ง่ายกว่า (มีเพียงสามเทมเพลตเท่านั้น ไม่ใช่ xsl:apply-templates, ไม่ใช่ xsl:variable, ไม่ใช่ 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>
person Dimitre Novatchev    schedule 06.04.2013

โปรดลองดู:

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

  <xsl:template match="loop">
    <xsl:value-of select="concat(value, ' ')"/>
  </xsl:template>

  <xsl:template match="loop[usage_id = 3]">
    <xsl:variable name="segmentId" select="@Segment_id" />
    <xsl:variable name="following12"
                  select="following-sibling::loop[@Segment_id = $segmentId]
                                                 [usage_id = 1 or usage_id = 2]" />
    <xsl:apply-templates
      select="current()[not(preceding-sibling::loop[1]
                                                   [@Segment_id = $segmentId]
                                                   [usage_id = 3])
                        and not($following12)]" mode="carat" />
    <xsl:apply-templates select="current()[$following12]" mode="na" />
  </xsl:template>

  <xsl:template match="loop" mode="na">
    <xsl:text>N/A </xsl:text>
  </xsl:template>

  <xsl:template match="loop" mode="carat">
    <xsl:text>^</xsl:text>
  </xsl:template>
</xsl:stylesheet>

เมื่อรันบนอินพุตตัวอย่างของคุณ ผลลัพธ์คือ:

41 2 raj ^IC d N/A wj 
person JLRishe    schedule 06.04.2013