2

我是 xsl 和路径的初学者。我想找到一种方法如何使用 xsl 和路径完成以下操作:

  1. 检查是否存在具有相同值的 ID 属性(例如 001 和 001)
  2. 如果有,将文本打印到 html 页面
  3. 如果没有(换句话说,如果所有属性名称都是唯一的),则将另一个文本打印到 html 页面。

我的xml如下:

 <shop>

  <product>
    <cookie ID="001">
       <price>2</price>
    </cookie>
  </product>

  <product>
    <bread ID="002">
       <price>5</price>
    </bread>
  </product>

  <product>
    <milk ID="003">
       <price>2</price>
    </milk>
  </product>

</shop>

我的想法是使用这样的东西:

<xsl:if test="count(distinct-values(@ID*) < count(//product)">
    <p>ID values are not unique!</p>
</xsl:if>

如果不同的 ID 值比产品少,请写一个文本“ID 值不是唯一的”

这显然是行不通的。有人可以帮我吗?

4

2 回答 2

1

根据项目总数和不同项目总数检查条件:count(distinct-values(//@ID)) = count(//@ID)正如理查德指出的那样,distinct-values仅 XPath 2.0,您使用的是 1.0 还是 2.0?

另外要清楚一点, using//将从根开始并查看该条件的所有节点,因此如果您只想检查@ID内的节点<shop>,请使用//shop/@ID

如果您使用的是 1.0,您可能会知道由于错误明确告诉您distinct-values无法找到该函数,但您可以在 1.0 中使用它以防万一:

XPath 1.0 解决方案:

boolean(//shop/product[./node()/@ID = preceding-sibling::product/node()/@ID or ./node()/@ID = following-sibling::product/node()/@ID])

在第一个中,我没有意识到节点名称发生了变化,那是我的错。只需将此条件替换为您当前的条件,如下所示:

<xsl:if test="boolean(//shop/product[./node()/@ID = preceding-sibling::product/node()/@ID or ./node()/@ID = following-sibling::product/node()/@ID] )">
    <p>ID values are not unique!</p>
</xsl:if>
于 2013-02-07T18:34:24.663 回答
0

尝试distinct-values(//@ID)

另外,我认为 distict-values 仅在 XPath 2.0 中可用。

于 2013-02-07T18:33:01.763 回答