1

次のような構造の XML ファイルを取得しました。

<?xml version="1.0"?>
 <medias>
  <media>
    <id>34500</id>
    <refid/>
  </media>
  <media>
    <id>34501</id>
    <refid>34500</refid>
  </media>
  <media>
    <id>34502</id>
    <refid>34500</refid>
  </media>
  <media>
    <id>34503</id>
    <refid>34501</refid>
  </media>
 <media>
    <id>34504</id>
    <ref/>
 </media>   
 <media>
    <id>34505</id>
    <refid>34502</refid>
 </media>   
</medias>

XSL 1.0 では、他から参照されていないすべてのノードにアクセスしたいと考えています。だから私は2つの変数を作成しました

<xsl:variable name="origID" select="media/id/text()"/>
<xsl:variable name="refID" select="media/refid/text()"/>

これら2つの要素セット間で差分操作を実行する方法を調べました

<xsl:variable name="diffID" select="$origID[count(. | $refID) != count($refID)]"/>

結果は次のとおりです。

origID には 34500、34501、34502、34503、34504、34505 が含まれます

refID には 34500、34500、34501、34502 が含まれます

私はそれを期待した

diffID には 34503、34504、34505 が含まれます。

しかし

diffID には、まだ 34500、34501、34502、34503、34504、34505 が含まれています。

IDが他のノードによって参照されているすべてのノードを取得するという私の目的を達成するための最良のアプローチは何でしょうか.

前もって感謝します

アンドレ

4

2 に答える 2

1

XSLT 2.0 では、except演算子を使用できます (プリミティブ値ではなくノードを選択する場合)。

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

<xsl:variable name="medias-with-id" select="//media[id]"/>
<xsl:variable name="referenced-medias" select="key('by-id', //refid)"/>

<xsl:key name="by-id" match="media" use="id"/>

<xsl:template match="/">
  <xsl:copy-of select="$medias-with-id except $referenced-medias"/>
</xsl:template>

</xsl:stylesheet>
于 2013-07-09T14:40:29.740 に答える