XSLT 1.0如何在document()函数中使用xsl:key

时间:2013-02-12 20:18:59

标签: document xslt-1.0 xslkey

我正在尝试使用xsl:key来使用XSL document()函数查找外部XML文档中的项目。我可以让xsl:key部分工作,如果,而不是使用document(),我只是合并两个XML文件(在C#中使用XmlDocument)。然而,两个XML文件都非常大,并且在某些情况下我开始出现“内存不足”错误。此外,我需要能够使用xls:key,否则该过程需要数小时。

在XSLT 2.0中,我相信你可以这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="lookupDoc" select="document('CodeDescriptions.xml')" />
    <xsl:key name="LookupDescriptionByCode" match="Code/@description" use="../@code" />

    <xsl:template match="ItemCode">
        <xsl:call-template name="MakeSpanForCode">
            <xsl:with-param name="code" select="text()" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="MakeSpanForCode">
        <xsl:param name="code" />
        <xsl:element name="span">
            <xsl:attribute name="title">
                <xsl:value-of select="$lookupDoc/key('LookupDescriptionByCode', $code)" />
            </xsl:attribute>
            <xsl:value-of select="$code" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

你如何在XSLT 1.0中实现这一目标呢?

1 个答案:

答案 0 :(得分:9)

您有两种可能性:

没有键

<xsl:template name="MakeSpanForCode">
    <xsl:param name="code" />

    <xsl:element name="span">
        <xsl:attribute name="title">
            <xsl:value-of select="$lookupDoc/*/Code[@code = $code]/@description" />
        </xsl:attribute>
        <xsl:value-of select="$code" />
    </xsl:element>
</xsl:template>

带密钥

键定义适用于所有文档,但您需要在使用key()函数之前更改上下文节点:

<xsl:template name="MakeSpanForCode">
    <xsl:param name="code" />

    <xsl:element name="span">
        <xsl:attribute name="title">
            <!-- trick: change context node to external document -->
            <xsl:for-each select="$lookupDoc">
                <xsl:value-of select="key('LookupDescriptionByCode', $code)"/>
            </xsl:for-each>
        </xsl:attribute>
        <xsl:value-of select="$code" />
    </xsl:element>
</xsl:template>

另请参阅Mike KayJeni Tennison关于此主题的两个重要邮件列表答案