我正在尝试使用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
表达式会导致问题?
答案 0 :(得分:2)
在XPath 2.0中允许使用$Match/(@key|translation/text())
,如XSLT 2.0中所使用的那样,但Perl很可能使用像libxslt这样的XSLT 1.0处理器。因此,您需要将其拼写为$Match/@key | $Match/translation/text()
。