我收集了不同作者的戏剧和诗集。我的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>
我错过了什么?
答案 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>