2012-05-04 8 views
2

私は様々な著者の戯曲と詩のコレクションを持っています。私はすべての演劇から「playcode」を抽出することに成功し、次のコードを使用している複数の述語を持つXPath

<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> 

::私のXMLは次のようになります

<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']/playcode/metadataBlock/meta[@content='Shakespeare, William' 
      [email protected]='Creator']"/> 
</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> 

、そのように:私は、複数のような可能性を試してみましたあなたの最初の提案で

答えて

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> 
+0

お時間をありがとうマーティンあなたの提案はうまくいきました。 – mfroese

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> 
関連する問題