xsl:copy-of:无法编译select表达式

时间:2016-06-10 12:44:39

标签: xml perl xslt

我正在尝试使用xsl stylesheet转换xml文件。

xml文件

<?xml version="1.0" encoding="utf-8"?>
<msg>
    <ent key="key1">
        <text>Error: Could not find </text>
        <translation>Another Error similar to previous one.</translation>
    </ent>
</msg>

xsl文件

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="msg">
        <xsl:for-each select="ent">
            <xsl:variable name="current_key" select="@key"/>
            <xsl:variable name="Match" select="$translations/msg/ent[@key = $current_key]"/>
            <xsl:choose>
                <xsl:when test="$Match and normalize-space($Match/text) = normalize-space(.) and (not(@translate) or @translate = true())">
                    <xsl:copy>
                        <xsl:copy-of select="$Match/(@key|translation/text())|@context"/>
                    </xsl:copy>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

@translate是其中一个属性,但我没有将它包含在示例xml文件中。

我使用Perl进行转换。 当我收到以下错误时,我使用了此answer中提到的脚本

Invalid expression
compilation error: file test.xsl line 11 element copy-of
xsl:copy-of : could not compile select expression '$Match/(@key|translation/text())|@context'
 at Transform.pl line 10

为什么select表达式会导致问题?

1 个答案:

答案 0 :(得分:2)

在XPath 2.0中允许使用$Match/(@key|translation/text()),如XSLT 2.0中所使用的那样,但Perl很可能使用像libxslt这样的XSLT 1.0处理器。因此,您需要将其拼写为$Match/@key | $Match/translation/text()