2

私はxslとpathの初心者です。xslとpathを使用して次のことを実現する方法を見つけたいと思います。

  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-valuesXPath 2.0のみですか、1.0または2.0で作業していますか?

また、明確にするために、を使用//するとルートから開始し、その条件のすべてのノードを確認します。したがって、@ID内のノードを確認するだけの場合は<shop>、を使用します。//shop/@ID

distinct-values1.0を使用している場合は、関数が見つからないことを明示的に示すエラーが原因でわかる可能性がありますが、万が一の場合に備えて、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はXPath2.0でのみ使用可能だと思います。

于 2013-02-07T18:33:01.763 に答える