XSLT 2.0 - 根据位置选择以下text()

时间:2014-03-17 16:58:44

标签: xslt-2.0

基于/ 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>&#x9;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>

1 个答案:

答案 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>&#x9;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进行交叉引用。