有人可以告诉我我的xslt语法有什么问题吗?
我已经确认我的Xpath表达式很好并且返回了正确的结果:
/*[local-name()='animal']/*[local-name()='birth']/*[local-name()='date']
现在,我试图在XSLT中使用“contains”函数重用此表达式以获取true或false,但它不起作用。我必须做错事。
我试过了:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="html"
encoding="UTF-8"
doctype-public="-//W3C//DTD HTML 4.01//EN"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"
indent="yes" ></xsl:output>
<xsl:template match="/">
<html>
<head>
<title>Test </title>
</head>
<body>
<p> Birth date 1998-08-20 (true/false) : </p>
<xsl:apply-templates select="/*[local-name()='animal']/*[local-name()='birth']"/>
</body>
</html>
</xsl:template>
<xsl:template match="/*[local-name()='birth']">
<xsl:value-of select="contains(/*[local-name()='date'], '1998-08-20')"> </xsl:value-of>
</xsl:template>
</xsl:stylesheet>
有人可以告诉我我做错了吗?
谢谢! : - )))
答案 0 :(得分:1)
如果没有看到您的XML,我们只能猜测。我会说如果这样:
/*[local-name()='animal']/*[local-name()='birth']/*[local-name()='date']
有效,那么你的根元素名称必须是animal
。因此:
/*[local-name()='birth']
无法工作,因为根元素的名称不是birth
(格式良好的XML只有一个根元素)。
-
附:你永远不应该使用像*[local-name()='xyz']
这样的黑客。了解如何使用前缀处理命名空间。
答案 1 :(得分:0)
你有太多的斜杠。在XPath中,当您使用/
启动表达式时,它会“跳转”到树的顶部,到达根节点。
您的模板匹配表达式应与birth
元素匹配(不带前导斜杠)。在该模板内部,上下文节点是birth
元素,因此contains()
表达式不应在date
元素之前具有前导斜杠。没有前导斜杠的XPath语句将选择相对于上下文节点的子项。
<xsl:template match="*[local-name()='birth']">
<xsl:value-of select="contains(*[local-name()='date'], '1998-08-20')"/>
</xsl:template>