【问题标题】:XSLT If nested node attributes values are less than 800XSLT 如果嵌套节点属性值小于 800
【发布时间】:2012-07-14 19:45:29
【问题描述】:

鉴于此 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>

我需要检查每个 trolly items value 属性是否低于 800,如果至少有一个项目低于 800,则显示 Final delivery 属性。但只需要显示一次 Delivery value。

我的 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 属性输出一项。

它只会显示一次,例如答案是:“Delivery Costs: 100”。所以只有当物品价值低于800时才收取运费

![在此处输入图片描述][1]

感谢您的帮助。

【问题讨论】:

  • 请显示您期望的输出。

标签: xml xslt


【解决方案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>

查看this xmlplayground 进行现场演示

更新

效率更高...

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

【讨论】:

  • 嗨,Freefaller,谢谢你,有没有办法限制输出在 @Delivery 显示 3 次时只显示一个输出。
  • @Morne,我假设您想要多行,因为这就是您放置 for-each 的原因。您能否编辑您的问题,确切地说是您期望从输入 XML 中得到什么?举几个例子就好了
  • 我用更多信息和屏幕截图稍微改变了我的问题
  • 很好用。我只需要像这样选择部分:select="//Final/@Delivery" 并显示了价值。
  • @Morne,很高兴为您服务...祝您项目顺利完成 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多