括号中的Xpath xlst文本函数

时间:2016-08-19 11:40:24

标签: xslt

拥有这个xml

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book>
  <title lang="en">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="en">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

如何理解

count(bookstore/book[text()]) > 1

4 个答案:

答案 0 :(得分:1)

方括号中的表达式是谓词

您的表达式(仅)计算具有子文本节点的书籍。

答案 1 :(得分:1)

如果大于1,则xpath表达式(对具有子文本节点的书籍进行计数)的计算结果为true;如果没有,则为假。

答案 2 :(得分:1)

如果您要检查'&lt; book&gt;',我认为xpath应该是这样的使用即时文本,其中XML元素具有缩进和换行符。

count(bookstore/book[text()[normalize-space()]]) gt 0

count(书店/书籍[text()])&gt; 1将结果'true'作为&lt; book&gt;它之后有空格,也是文字。

示例XML:

<bookstore>
<book>
  <title lang="en">Harry Potter</title>
  <price>29.99</price>
</book>

<book>2
  <title lang="en">Learning XML</title>
  <price>39.95</price>
</book>
<book>7</book>
</bookstore>

<强> XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:if test="count(bookstore/book[text()[normalize-space()]]) gt 0">
        <xsl:value-of select="count(bookstore/book[text()[normalize-space()]])"/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

将结果 2 ,因为有三个&lt; book&gt;元素在那里,但第二和第三&lt; book&gt;元素具有直接文本(那些文本是2和7),但第一个元素是一个元素(不是直接文本)。

如果您的输入xml提供给此XSLT,则会有 count = 0 ,因为&lt; book&gt;没有立即文本(不考虑空格,因为我使用了normalize-space()函数)。

答案 3 :(得分:1)

book[text()]匹配book元素(如果它具有子文本节点)。那部分很容易。

现在你的例子,如:

<book>
  <title lang="en">Harry Potter</title>
  <price>29.99</price>
</book>

book元素是否在此处有子文本节点?这得看情况。它当然有两个元素节点子节点,但它们不计算在内。它还可以有三个仅空白的文本节点 - <book><title之间,</title><price之间的空格,以及</price>和{之间的空格{1}}。

通常,如果样式表中没有</book声明,则存在这些文本节点。但是,它们可能会在许多情况下被删除:

(a)Microsoft MSXML解析器众所周知地删除空格,除非您礼貌地要求不这样做。 (如果你在浏览器中运行,则无法询问)。

(b)如果您有一个DTD或模式将<xsl:strip-space>定义为仅包含元素的内容,并且您根据DTD或模式进行验证,则XSLT 2.0表示应该删除空白。

(c)您可能正在自己构建输入树,例如作为DOM,或者您可能正在使用其他外部工具构建树,并且他们可能有删除空格的选项。