如何确定xml是否包含两个或多个具有xsl和Xpath的相等属性名称?

时间:2013-02-07 18:22:36

标签: xml xslt xpath

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

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

    这显然不起作用。有人可以帮助我吗?

2 个答案:

答案 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中可用。

相关问题