当我尝试计算父节点中的子节点时,我很少使用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>
Run Code Online (Sandbox Code Playgroud)
模板(简化)如下:
**<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>
Run Code Online (Sandbox Code Playgroud)
我没有从这种方法中获得正确的子节点数.除此之外count(review),我尝试count(descendant::review)了几种xPath变体.我知道我错过了一些简单的东西 - 但是什么?
Dim*_*hev 12
Run Code Online (Sandbox Code Playgroud)<xsl:if test="rating"> <span class="review-count"> **(<xsl:value-of select="count(review)"/>)** </span> </xsl:if>
这将永远不会生成单个字符,因为rating提供的XML文档中没有元素.如果删除上述条件指令,则结果包含所需的计数值.
如果你确实有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>
Run Code Online (Sandbox Code Playgroud)
当应用于提供的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>
Run Code Online (Sandbox Code Playgroud)
产生想要的,正确的结果:
<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>
...
...
Run Code Online (Sandbox Code Playgroud)