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