我正在开发一个应用程序,我需要转换如下所示的XML文档:
<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE words SYSTEM "words.dtd">
<words>
<word id="word_1">Alfa</word>
<word id="word_2">Beta</word>
<word id="word_3">Gamma</word>
<word id="word_4">Delta</word>
<word id="word_5">Zeta</word>
</words>
使用XSLT样式表。我希望转换的结果是(在这种情况下)Delta
,这是我正在使用的XSL:
<?xml version='1.0' encoding='ISO-8859-1'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="Hurrengo_Hitza">word_4</xsl:param>
<xsl:template match="word/[@id = Hurrengo_Hitza]">
<html>
<body>
<tr>
<td><xsl:value-of select="text()"/></td>
</tr>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
它没有显示结果,我在XSLT中需要更改什么? XPath表达式出了什么问题?
答案 0 :(得分:3)
这里有两个问题:
word/[@id = Hurrengo_Hitza]
语法无效XPath - 谓词showld遵循位置步骤中的节点测试。
<xsl:template match="word/[@id = Hurrengo_Hitza]">
。即使更正为<xsl:template match="word[@id = Hurrengo_Hitza]">
现在语法上有效的XPath表达式和匹配模式,此模板也不匹配任何节点 - 它匹配任何word
其id
属性的字符串值等于其Hurrengo_Hitza
元素之一的字符串值。但是,提供的XML文档中没有word
元素具有名为Hurrengo_Hitza
的子元素 - 因此模板与任何节点都不匹配,根本不会执行。
<强>解决方案强>:
您想要的是匹配模式,例如:word[@id = $Hurrengo_Hitza]
- 变量或参数引用必须以$
字符开头。
如果您更改:
<xsl:template match="word/[@id = Hurrengo_Hitza]">
以强>:
<xsl:template match="word[@id = $Hurrengo_Hitza]">
您将拥有一个有效的 XSLT 2.0 解决方案。
但是,在XSLT 1.0(您似乎正在使用)中,在匹配模式中包含变量或参数是非法的。
因此,XSLT解决方案将是这样的:
<xsl:template match="word">
<xsl:if test="@id = $Hurrengo_Hitza">
<!-- Processing here -->
</xsl:if>
</xsl:template>
答案 1 :(得分:1)
XSLT中的参数需要以dolar符号($)
开头所以试试:
<xsl:template match="word[@id = $Hurrengo_Hitza]">
<强>更新强>
我认为在XSLT 2上的匹配属性上只允许variables
。
但是你可以这样做:
<xsl:param name="Hurrengo_Hitza" select="'word_4'" />
<xsl:template match="/">
<xsl:for-each select="//word[@id = $Hurrengo_Hitza]">
<html>
<body>
<tr>
<td><xsl:value-of select="text()"/></td>
</tr>
</body>
</html>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
更改
<xsl:template match="word/[@id = Hurrengo_Hitza]">
到
<xsl:template match="word/[@id = $Hurrengo_Hitza]">