0
<my-courses>
  <courses-reqd>
     <details> 
       <subject>Math</subject>
     </details>
     <details>
       <subject>Econ</subject>
     </details>
     <details>
       <subject>Geog</subject>
     </details> 
     <details>
       <subject>Phys</subject>
     </details>
     <detail>
       <subject>Zool</subject>
     </details>
  </courses-reqd>
  <courses-taken>
    <details> 
      <subject>Math</subject>
    </details>
    <details>
      <subject>Econ</subject>
    </details>
    <detail>
      <subject>Zool</subject>
    </details>
  </courses-taken>

私はサンプル XML を提供しており、XPATH を使用して、コース受講ではなくコース必須の値を取得する方法を知りたいと考えています。提供されたケースでは、コース受講には存在しないため、答えは Geog と Phys になります。

<xsl:apply-templates select="my-courses\courses-reqd | not(my-courses\courses-taken)"/>

これは可能ですか?もしそうなら、どうすればこれを行うことができますか? どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

0

ここでの簡単な答えは、これを行うことです。

<xsl:apply-templates
   select="/my-courses/courses-reqd/detail
                [not(subject = /my-courses/courses/taken/details/subject)]" />

より良い (より効率的な) アプローチは、キーを使用することです。

これは、XSLT の先頭に向かって追加されます。

<xsl:key name="kTaken" match="courses-taken//subject" use="."/>

そして、これはテンプレートの 1 つで使用されます。

<xsl:apply-templates 
         select="/my-courses/courses-reqd/detail[not(key('kTaken', subject))]" />

サンプル入力に対してこの XSLT を実行すると (サンプル入力が修正され、「detail」ではなく「details」という名前の要素が一貫して使用されるようになった後:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kTaken" match="courses-taken//subject" use="."/>

  <xsl:template match="/">
    <root>
      <xsl:apply-templates 
          select="/my-courses/courses-reqd/details[not(key('kTaken', subject))]" />
    </root>
  </xsl:template>

  <xsl:template match="details">
    <course>
      <xsl:value-of select="subject"/>
    </course>
  </xsl:template>
</xsl:stylesheet>

結果は次のとおりです。

<root>
  <course>Geog</course>
  <course>Phys</course>
</root>
于 2013-02-04T20:39:12.283 に答える