【问题标题】:Count xml elements with multiple conditions and precise properties计算具有多个条件和精确属性的 xml 元素
【发布时间】:2014-05-15 11:55:40
【问题描述】:

我有以下代码(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>

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

【问题讨论】:

  • 最后一个 XPath 表达式不会返回任何结果

标签: xml xslt count multiple-conditions


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    在你的情况下,这个表达式:

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

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

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

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

    这将为您提供七个节点。

    【讨论】:

    • 我的目标是选择类型等于房子和上下文等于厨房的节点。所以我应该有2个节点。 Lingamurthy CS 找到了正确的解决方案。但也感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多