1

我有以下代码(xml 和 xslt),我想用 2 个条件计算一些 xml 元素。

XML代码:

<home>
    <place Value='place1'>
        <property Name="Type" Value="house" />
        <property Name="Context" Value="roof" />
        <property Name="Color" Value="blue" />
    </place>
    <place Value='place2'>
        <property Name="Type" Value="house" />
        <property Name="Context" Value="kitchen" />
        <property Name="Color" Value="red" />
    </place>
    <place Value='>
        <property Name="Type" Value="house" />
        <property Name="Context" Value="floor" />
        <property Name="Color" Value="black" />
    </place>
    <place Value='place4'>
        <property Name="Type" Value="house" />
        <property Name="Context" Value="kitchen" />
        <property Name="Color" Value="black" />
    </place>
    <place Value='place5'>
        <property Name="Type" Value="apartment" />
        <property Name="Context" Value="roof" />
        <property Name="Color" Value="blue" />
    </place>
    <place Value='place6'>
        <property Name="Type" Value="apartment" />
        <property Name="Context" Value="kitchen" />
        <property Name="Color" Value="red" />
    </place>
</home>

xslt代码:

<html>
<body>
<table border="1" cellspacing="0" cellpadding="3">
    <tr>
    <td>Place</td>
    <td>Type</td>
    <td>Context</td>
    <td>Color</td>
    </tr>
    <xsl:for-each select="place">
        <tr>
            <td><xsl:value-of select="@Value" /></td>
            <td><xsl:value-of select="property[@Name='Type']/@Value" /></td>
            <td><xsl:value-of select="property[@Name='Context']/@Value" /></td>
            <td><xsl:value-of select="property[@Name='Color']/@Value" /></td>
        </tr>
    </xsl:for-each>
</table>

<table>
    <tr>
        <td>
            Number of house:
        </td>
        <td>
            <xsl:value-of select="count(place/property[@Name='Type' and @Value='house'])"/>
        </td>
    </tr>
    <tr>
        <td>
            Number of kitchen:
        </td>
        <td>
            <xsl:value-of select="count(place/property[@Name='Context' and @Value='kitchen'])"/>
        </td>
    </tr>
    <tr>
        <td>
             Number of house with kitchen:
        </td>
        <td>
            <xsl:value-of select="count(place/property[@Name='Type' and @Value='house'][@Name='Context' and @Value='kitchen'])"/>
        </td>
    </tr>
</table>

</body>
</html>

前两个计数工作正常(这些计数只有一个条件),但第三个计数不起作用,因为有两个条件。任何建议如何使它工作?谢谢。

4

2 回答 2

2

如果您想计算“房子”和“厨房”的位置,请使用此表达式:

count(home/place[property[@Name='Type' and @Value='house'] and property[@Name='Context' and @Value='kitchen']])
于 2014-05-15T12:19:46.000 回答
0

每个谓词限制前一个上下文的结果节点集。如果您在位置路径上有两个谓词,则必须考虑第一个会限制位置路径表达式的结果节点集,从而创建新的上下文(节点较少),然后将第二个谓词应用于这个较小的放。

在您的情况下,此表达式:

/home/place/property

产生一个包含 18 个项目的节点集。添加第一个谓词时:

/home/place/property[@Name='Type' and @Value='house']

你现在有了一个新的上下文,只有四个节点:

/home[1]/place[1]/property[1]
/home[1]/place[2]/property[1]
/home[1]/place[3]/property[1]
/home[1]/place[4]/property[1]

您的第二个谓词仅应用于这四个节点。当你添加它

[@Name='Context' and @Value='kitchen'] 

对于您的表达式(或上述任何一个节点),它将返回一个空集。

如果您将这些谓词中的任何一个单独添加到您的位置路径,您确实会得到结果。如果您想考虑所有这些,您应该对您的集合执行联合操作:

/home/place/property[@Name='Type' and @Value='house'] | /home/place/property[@Name='Context' and @Value='kitchen']

这将为您提供七个节点。

于 2014-05-15T12:32:00.463 回答