鉴于此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 < 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 :(得分:1)
内部xsl:if
和xsl: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 < 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 < 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>