带有多个谓词的XPath

时间:2012-05-04 03:23:10

标签: xpath xslt-2.0 predicates

我收集了不同作者的戏剧和诗集。我的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>

我已成功使用以下代码从所有播放中提取“playcode”:

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

我错过了什么?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>