2

私はさまざまな作家の戯曲と詩のコレクションを持っています。私のXMLは次のようになります。

<works>
    <editions>
       <edition>
           <playtitle>Henry IV, Part 1</playtitle>
           <playcode>1H4</playcode>
           <genre>play</genre>
           <metadataBlock>
               <meta content="Shakespeare, William" name="Creator"/>
           </metadataBlock>
       </edition>
    </editions>
</works>

次のコードを使用して、すべてのプレイから「プレイコード」を抽出しました。

<xsl:when test="$only = 'plays'">
    <xsl:sequence select="/works/editions/edition[genre = 'play']/playcode"/>
</xsl:when>

しかし、シェイクスピアが書いたすべての戯曲から「プレイコード」を抽出する方法がわかりません。次のような複数の可能性を試しました。

<xsl:when test="$only = 'plays'">
    <xsl:sequence select="/works/editions/edition[genre = 'play' 
        and @content='Shakespeare, William' 
        and @name='Creator']/playcode"/>
</xsl:when>

そして次のように:

<xsl:when test="$only = 'plays'">
      <xsl:sequence select="/works/editions/edition[genre =       
        'play']/playcode/metadataBlock/meta[@content='Shakespeare, William' 
           and@name='Creator']"/>
</xsl:when>

何が足りないの??

4

2 に答える 2

1

最初の提案では、エディション要素のコンテンツ名前の属性を評価しようとします。それらは存在しないため、結果のシーケンスは空になります。したがって、次のようにXPath式を変更します。

<xsl:when test="$only = 'plays'">
  <xsl:sequence select="/works/editions/edition[
    genre='play' and
    metadataBlock/meta[
      @content='Shakespeare, William' and
      @name='Creator'
    ]
  ]/playcode"/>
</xsl:when>
于 2012-05-04T06:16:29.883 に答える
0

利便性と効率の両方のために、キーを使用します

key('kPlaysByAuthor', 'Shakespeare, William')

だけを選択するにはplaycode:

key('kPlaysByAuthor', 'Shakespeare, William')/playcode

完全な例を次に示します。

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

     <xsl:key name="kPlaysByAuthor" match="edition"
      use="metadataBlock/meta[@name='Creator']/@content"/>

     <xsl:template match="/">
         <xsl:copy-of select=
          "key('kPlaysByAuthor', 'Shakespeare, William')/playcode"/>
     </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用された場合:

<works>
    <editions>
       <edition>
           <playtitle>Henry IV, Part 1</playtitle>
           <playcode>1H4</playcode>
           <genre>play</genre>
           <metadataBlock>
               <meta content="Shakespeare, William" name="Creator"/>
           </metadataBlock>
       </edition>
       <edition>
           <playtitle>Some Title</playtitle>
           <playcode>XYZ</playcode>
           <genre>play</genre>
           <metadataBlock>
               <meta content="Someone, Else" name="Creator"/>
           </metadataBlock>
       </edition>
    </editions>
</works>

必要な正しい結果が生成されます。

<playcode>1H4</playcode>
于 2012-05-04T13:11:22.733 に答える