当我尝试计算父节点中的子节点时,我很少使用XLST并得到令人困惑的结果。
修改
XML的结构如下:
<?xml version="1.0"?>
<Response>
<result>
<name>Someone</name>
**<rating>4.5</rating>**
<review>
<text>Some review.</text>
</review>
<review>
<text>Another review.</text>
</review>
</result>
<result>
<name>Another one</name>
**<rating>2</rating>**
<review>
<text>Blah, grieve, blah.</text>
</review>
<review>
<text>Blah, grrrrr, blah.</text>
</review>
<review>
<text>Blah, good grrrrr, blah.</text>
</review>
</result>
...
...
</Response>
模板(简化)如下:
**<body>
<xsl:apply-templates/>
</body>**
<xsl:template match="Response/result">
<div class="item">
<div class="name">
<xsl:value-of select="name"/>
</div>
<xsl:if test="rating">
<span class="review-count">
**(<xsl:value-of select="count(review)"/>)**
</span>
</xsl:if>
</div>
</xsl:template>
我没有从这种方法中获得正确的子节点数。除了count(review)
之外,我还尝试了count(descendant::review)
和几个xPath变体。我知道我错过了一些简单的东西 - 但是什么?
答案 0 :(得分:12)
<xsl:if test="rating"> <span class="review-count"> **(<xsl:value-of select="count(review)"/>)** </span> </xsl:if>
这永远不会生成单个字符,因为提供的XML文档中没有rating
元素。如果删除上述条件指令,则结果包含所需的计数值。
如果你确实有至少一些rating
元素的review
子元素(但未向我们展示),那么你可能也没有显示XML文档的其他重要部分 - 例如默认命名空间。
<强>更新强>:
OP提供了更精确的XML文档,其中包含rating
个元素。
我无法重现问题。
此XSLT转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Response/result">
<div class="item">
<div class="name">
<xsl:value-of select="name"/>
</div>
<xsl:if test="rating">
<span class="review-count">
**(<xsl:value-of select="count(review)"/>)**
</span>
</xsl:if>
</div>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<Response>
<result>
<name>Someone</name>
<rating>4.5</rating>
<review>
<text>Some review.</text>
</review>
<review>
<text>Another review.</text>
</review>
</result>
<result>
<name>Another one</name>
<rating>2</rating>
<review>
<text>Blah, grieve, blah.</text>
</review>
<review>
<text>Blah, grrrrr, blah.</text>
</review>
<review>
<text>Blah, good grrrrr, blah.</text>
</review>
</result>
...
...
</Response>
会产生想要的正确结果:
<div class="item">
<div class="name">Someone</div>
<span class="review-count">
**(2)**
</span>
</div>
<div class="item">
<div class="name">Another one</div>
<span class="review-count">
**(3)**
</span>
</div>
...
...