XSL:外部文件的KEY函数

时间:2017-02-14 07:46:56

标签: xslt-2.0

我在按键功能方面遇到问题,按键功能未在以下代码中运行。

我的输入是

XML(Keys.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Keys>
    <Key year="2001" name="ABC"/>
    <Key year="2002" name="BCA"/>
</Keys>

要转换的XML

<?xml version="1.0" encoding="UTF-8"?>
<p>
    <text> .. .. <key>ABC</key> ...</text>
    <text> .. .. <key>BCA</key> ...</text>
</p>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:key name="keydata" match="*[name() = document('keys.xml')]/Keys/Key" use="@name"/>
    <xsl:template match="key">
        <xsl:copy>
            <xsl:attribute name="ref"><xsl:value-of select="key('keydata', .)/@year"/></xsl:attribute>
            <xsl:value-of select="."/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出

<p>
    <text> .. .. <key ref="">ABC</key> ...</text>
    <text> .. .. <key ref="">BCA</key> ...</text>
</p>

所需的输出

<p>
    <text> .. .. <key ref="2001">ABC</key> ...</text>
    <text> .. .. <key ref="2002">BCA</key> ...</text>
</p>

2 个答案:

答案 0 :(得分:1)

<xsl:key name="keydata" match="*[name() = document('keys.xml')]/Keys/Key" use="@name"/>更改为<xsl:key name="keydata" match="Keys/Key" use="@name"/>,然后将<xsl:attribute name="ref"><xsl:value-of select="key('keydata', .)/@year"/></xsl:attribute>更改为<xsl:attribute name="ref" select="key('keydata', . doc('Keys.xml'))/@year"/></xsl:attribute>

答案 1 :(得分:1)

这应该有效:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

    <xsl:variable name="keys" select="document('keys.xml')" as="document-node()"/>

    <xsl:key name="keydata" match="Key" use="@name"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="key">
        <xsl:copy>
            <xsl:attribute name="ref"><xsl:value-of select="$keys/key('keydata', current())/@year"/></xsl:attribute>
            <xsl:value-of select="."/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

在XSL规范中,有一个名为“Example: Using Keys to Reference other Documents”的示例与您的用例完全匹配。

这是结果文件:

<?xml version="1.0" encoding="UTF-8"?>
<p>
    <text> .. .. <key ref="2001">ABC</key> ...</text>
    <text> .. .. <key ref="2002">BCA</key> ...</text>
</p>