我有这样的XML:
<exam>
<section name="SampleSection1">
<attributes>
<variable_name data_type="String" value="SCORE"/>
</attributes>
<item name="SampleItem1-1"/>
<item name="SampleItem1-2"/>
<item name="SampleItem1-3"/>
</section>
<section name="SampleSection2">
<attributes>
<variable_name data_type="String" value="NO-SCORE"/>
</attributes>
<item name="SampleItem2-1"/>
<item name="SampleItem2-2"/>
</section>
</exam>
我想计算一个变量名为“SCORE”的部分中的项目数。
我认为这可以胜任:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="section">
<xsl:variable name="scoredItems"
select="./item/../attributes/variable_name[@value='SCORE']"/>
<xsl:variable name="scoredItemsCount" select="count($scoredItems)"/>
<xsl:value-of select="$scoredItemsCount"/>
</xsl:template>
</xsl:stylesheet>
然而,这输出:
1
0
不
3
0
这是我期望的(也是想要的)。
我在这里做错了什么?
答案 0 :(得分:2)
<xsl:variable name="scoredItems" select="./item/../attributes/variable_name[@value='SCORE']"/>
这会选择所有variable-name
元素,以使其value
属性的值为'SCORE'
。而只是一个节点。
你想:
<强> self::section[attributes/variable_name/@value='SCORE']/item
强>
如果上下文节点(section
)的元素attributes
具有variable_name
属性为''SCORE'的元素value
,则会选择所有项元素。
如果上下文节点没有该属性,则上面的XPath表达式不会选择任何内容。
现在已更正的转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="section">
<xsl:variable name="scoredItems"
select="self::section[attributes/variable_name/@value='SCORE']/item"/>
<xsl:variable name="scoredItemsCount" select="count($scoredItems)"/>
<xsl:value-of select="$scoredItemsCount"/>
</xsl:template>
</xsl:stylesheet>
产生想要的结果:
3
0