XSLT如果嵌套节点属性值小于800

时间:2012-07-14 19:45:29

标签: xml xslt

鉴于此XML

    <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]

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

xsl:for-each中的所有节点都相对于select中的xpath,并且因为您使用的是相对路径(它们不是以/或{{1}开头})然后你正在寻找

//

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

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

请参阅this xmlplayground了解实时演示

<强>更新

效率更高......

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

<强>更新

基于OP的评论,可能更像是这样(请记住,我假设您的实际XML会比您当前显示的更复杂,所以这可能不是您正在寻找的为)...

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