2014-05-15 32 views
1

我有以下代码(xml和xslt),我想用2个条件计算一些xml元素。计算具有多个条件和精确属性的xml元素

XMLcode:

<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> 

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

+0

最后的XPath表达式不会返回任何结果 – helderdarocha

回答

1

用这句话,如果你想指望这是“家”的地方,有“厨房”:

count(home/place[property[@Name='Type' and @Value='house'] and property[@Name='Context' and @Value='kitchen']]) 
+0

感谢Lingamurthy CS,这是我的预期。 – Nicolas

+0

@Nicolas请将其标记为正确,并单击问题旁边的复选标记(如果您愿意,请将其填上),因为它已被回答。 – helderdarocha

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'] 

,这将给你七个节点。

+0

我的目标是选择类型等于房屋和环境等于厨房的节点。所以我应该有2个节点。 Lingamurthy CS找到了正确的解决方案。但也感谢你的帮助。 – Nicolas

相关问题