0

私はxml、xsl、およびxPathの初心者です。すべての refid 属性が有効であることを確認する方法を知りたいですか?

つまり、すべての refid 属性に一致する ID 属性 (もちろん同じ値) がある場合に TRUE を返す xPath 1.0 クエリが必要です。すべての製品に ref ノードが必要なわけではありません。

例: Cookie がパンを指し、パンがミルクを指し、ミルクがクッキーを指している場合は TRUE を返し、それ以外の場合は FALSE を返します。

私はこれを解決しようとしてきましたが、うまくいかない良い例をウェブで検索しました。助けていただければ幸いです。

ここに私のXMLがあります:

<shop>
 <product>
    <cookie ID="01">
    <price>2</price>
    </cookie>
    <ref refid="02"/>
 </product>

  <product>
    <bread ID="02">
    <price>5</price>
    </bread>
    <ref refid="03"/>
 </product>

 <product>
   <milk ID="03">
   <price>2</price>
   </milk>
   <ref refid="01"/>
</product>

</shop>
4

3 に答える 3

1

質問がタグ付けさxsltれているだけでなくxpath、キーを使用した XSLT 1.0 アプローチをあえて提案します。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:key name="id" match="product" use="*[1]/@ID"/>

<xsl:template match="/">
  <xsl:choose>
    <xsl:when test="//ref[not(key('id', @refid))]">FALSE</xsl:when>
    <xsl:otherwise>TRUE</xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>
于 2013-02-15T14:46:25.317 に答える
1

を使用できますboolean()true以下は、またはのいずれかを返しますfalse

boolean(not(//@refid[not(.=//@ID)]))

XSLT の例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:value-of select="boolean(not(//@refid[not(.=//@ID)]))"/>
    </xsl:template>

</xsl:stylesheet>

boolean()xsl:keyMartin のより効率的なバージョンでも使用できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="id" match="product" use="*[1]/@ID"/>

    <xsl:template match="/">
        <xsl:value-of select="boolean(not(//ref[not(key('id', @refid))]))"/>
    </xsl:template>

</xsl:stylesheet>
于 2013-02-15T15:53:50.597 に答える
0

@refid一致するものがないすべての属性を検索します@id

//@refid[not(//@ID = .)]

結果を数え、これをゼロと比較するとtrue、有効な入力とfalse壊れた参照に対して返されます。

count(//@refid[not(//@ID = .)]) = 0
于 2013-02-15T15:01:41.633 に答える