使用XSLT包含的函数不起作用,但xpath表达式是好的

时间:2017-05-28 19:54:55

标签: html xml xslt xpath

有人可以告诉我我的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>

有人可以告诉我我做错了吗?

谢谢! : - )))

2 个答案:

答案 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>