我是xsl和path的初学者。我想找到一种方法如何使用xsl和path完成以下操作:
我的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值不唯一”
这显然不起作用。有人可以帮助我吗?
答案 0 :(得分:1)
根据总项目检查条件,以及总共不同的项目如下:count(distinct-values(//@ID)) = count(//@ID)
正如Richard指出的那样,distinct-values
只是XPath 2.0,你使用的是1.0还是2.0?
另外要明确的是,使用//
将从根开始查看该条件的所有节点,因此如果您只想检查@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>
答案 1 :(得分:0)
尝试distinct-values(//@ID)
另外,我认为distinct-values仅在XPath 2.0中可用。