基于/ document / meta / contrib-group / contrib / ref / sup的值,我一直试图确定正确的谓词来访问/ document / meta / aff / sup / italic之后的text() /斜体。
老实说,我甚至不确定我是否正确地表达了这个问题。我知道/ document / meta / aff /中有文本节点,但我不知道如何以正确的顺序找到它们。在下面的示例XSLT中,我开始尝试使用position()来确定正确的文本,但我认为我需要额外的谓词。
提前感谢您的时间和麻烦!
尾文本的XML:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<meta>
<contrib-group>
<contrib type="author">
<name>
<surname>Smith</surname>
<given-name>Alan</given-name>
</name>
<ref type="aff">
<sup>
<italic>a</italic>
</sup>
</ref>
</contrib>
<contrib type="author">
<name>
<surname>Jones</surname>
<given-name>Beatrice</given-name>
</name>
<ref type="aff">
<sup>
<italic>b</italic>
</sup>
</ref>
</contrib>
<contrib type="author">
<name>
<surname>Richardson</surname>
<given-name>Clarence</given-name>
</name>
<ref type="aff">
<sup>
<italic>c</italic>
</sup>
</ref>
</contrib>
</contrib-group>
<aff>
<sup>
<italic>a</italic>
</sup>An Institutional Name
<sup>
<italic>b</italic>
</sup>An Institutional Name
<sup>
<italic>c</italic>
</sup>An Institutional Name
</aff>
</meta>
</document>
尾文本XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="document/meta/contrib-group/contrib[@type='author']"/>
</xsl:template>
<xsl:template match="document/meta/contrib-group/contrib[@type='author']">
<xsl:variable name="vPosition"
select="position()"/>
<xsl:text>Name: </xsl:text>
<xsl:value-of select="concat(name/given-name, ' ', name/surname)"/>
<xsl:text>	Affiliation: </xsl:text>
<xsl:choose>
<xsl:when test="ref/sup/italic = /document/meta/aff/sup/italic">
<xsl:value-of select="concat(
$vPosition,
' ',
ref/sup/italic)"/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
我认为您想要定义一个键和交叉引用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text"/>
<xsl:key name="aff" match="/document/meta/aff/sup[italic]" use="italic"/>
<xsl:template match="/">
<xsl:apply-templates select="document/meta/contrib-group/contrib[@type='author']"/>
</xsl:template>
<xsl:template match="document/meta/contrib-group/contrib[@type='author']">
<xsl:variable name="vPosition"
select="position()"/>
<xsl:text>Name: </xsl:text>
<xsl:value-of select="concat(name/given-name, ' ', name/surname)"/>
<xsl:text>	Affiliation: </xsl:text>
<xsl:choose>
<xsl:when test="key('aff', ref/sup/italic)">
<xsl:value-of select="concat(
$vPosition,
' ',
key('aff', ref/sup/italic)/following-sibling::text()[1])"/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
根据您的输入我得到结果
Name: Alan Smith Affiliation: 1 An Institutional Name
Name: Beatrice Jones Affiliation: 2 An Institutional Name
Name: Clarence Richardson Affiliation: 3 An Institutional Name
显然xsl:choose
有点令人费解,但是你已经把它放在那里,所以我把它留作发布,只更改代码以显示如何基于italic
进行交叉引用。