2012-07-14 48 views
0

鉴于这种XMLXSLT如果嵌套节点属性值都小于800

<ContentBlock> 
    <Content> 
     <QuickStatus Balance="0" Credits="0" Trolley="600" Delivery="100" Available="-700" Pending="0" /> 
     <TrolleyItems> 
      <TrolleyItem Description="Test Item 1" value="150" /> 
      <TrolleyItem Description="Test Item 2" value="150" /> 
      <TrolleyItem Description="Test Item 3" value="300" /> 
     </TrolleyItems> 
    </Content> 
</ContentBlock> 

我需要检查,如果每个小车物品价值属性是800下,然后显示最终交付的属性,如果至少一个该项目是在800以下。但只需要显示一次传递值。

我的XSLT .xsl文件代码如下所示。

<xsl:for-each select="Content/TrolleyItems/TrolleyItem"> 
    <xsl:if test="ContentBlock/Content/TrolleyItems/TrolleyItem/@value &lt; 800"> 
     <tr style="border-bottom: 1px dashed #000;"> 
      <xsl:for-each select="Content/Final"> 
      <td>Delivery Fee</td><td><xsl:value-of select="@Delivery"/></td> 
      </xsl:for-each> 
     </tr> 
     </xsl:if> 
     </xsl:for-each> 

我需要的是为@Delivery属性输出一个项目。

它只会显示一次,例如答案将是:“运送成本:100”。所以当项目值小于800

交货只收取![在这里输入的形象描述] [1]

感谢您的帮助。

+0

请显示您期望的输出。 – 2012-07-14 20:08:43

回答

1

内部的xsl:ifxsl:for-each不应该有完整的路径。

xsl:for-each内的所有节点都是相对于在select的XPath和因为您使用相对路径(他们不///启动),那么你正在寻找

Content/TrolleyItems/TrolleyItem/ContentBlock/Content/TrolleyItems/TrolleyItem 

我认为你在寻找的是这样的事情...

<xsl:for-each select="Content/TrolleyItems/TrolleyItem[@value"> 
    <xsl:if test="./@value &lt; 800"> 
    <tr style="border-bottom: 1px dashed #000;"> 
     <xsl:for-each select="/Content/Final"> 
     <td>Delivery Fee</td><td><xsl:value-of select="@Delivery"/></td> 
     </xsl:for-each> 
    </tr> 
    </xsl:if> 
</xsl:for-each> 

了现场演示

更新

更高效......

<xsl:for-each select="Content/TrolleyItems/TrolleyItem[@value &lt; 800]"> 
    <tr style="border-bottom: 1px dashed #000;"> 
    <xsl:for-each select="/Content/Final"> 
     <td>Delivery Fee</td><td><xsl:value-of select="@Delivery"/></td> 
    </xsl:for-each> 
    </tr> 
</xsl:for-each> 

更新

基于由OP的评论,也许更多的东西像这样的(记住,我假设你实际的XML会比现在显示的复杂得多,所以这可能不是您正在寻找的内容)...

<xsl:if test="Content/TrolleyItems/TrolleyItem/@value &lt; 800"> 
    <tr style="border-bottom: 1px dashed #000;"> 
    <td>Delivery Fee</td><td><xsl:value-of select="/Content/Final/@Delivery"/></td> 
    </tr> 
</xsl:if> 
+0

嗨Freefaller谢谢你,有没有办法限制输出只显示@Delivery的一个输出,在它显示3次的时刻。 – 2012-07-14 20:19:03

+0

@Morne,我以为你想要多行,因为这就是为什么你要把'for-each'。你能**编辑**你的问题与你期望得到什么输入XML?几个例子会很好 – freefaller 2012-07-14 20:20:29

+0

我已经改变了我的问题了一点,更多的信息和截图 – 2012-07-14 20:30:15