2013-04-06 93 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