2013-04-06 91 views
1

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

我想返回「值」僅當它的usage_id是1或2。在情況下,如果是usage_id 3它應該返回「N/A」 。 然而,例如,如果在Segment_id = 3 LoopElementOrder_no = 5中,那麼Segment_id = 3的剩餘部分不包含任何Usage_id作爲1或2,在這種情況下,我需要返回「^」並繼續從Segment_id = 4 LoopElementOrder_no = 1。

針對上述所需的輸出是:

41 2 raj ^IC d N/A wj 
+0

你能告訴您的預計產量在這種情形下的樣品?謝謝! – 2013-04-06 08:53:08

+0

謝謝蒂姆。這裏是輸出相同的以上情況41 2 raj^IC d – user2251759 2013-04-06 08:59:53

+0

所以,你能告訴我們一個輸入的例子,會導致在輸出中有「N/A」嗎? – JLRishe 2013-04-06 10:43:15

回答

0

更短,更簡單(只有三個模板,沒有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> 
+0

謝謝,這對我很好! – user2251759 2013-04-07 06:21:06

+0

@ user2251759,不客氣。 – 2013-04-07 06:51:21

0

請試試這個:

<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