2012-05-04 65 views
2

我收集了來自不同作者的劇本和詩歌。我的XML看起來是這樣的:具有多個謂詞的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> 

我用下面的代碼成功地從所有的戲劇中提取「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' 
      [email protected]='Creator']"/> 
</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>