拥有这个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
?
答案 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,或者您可能正在使用其他外部工具构建树,并且他们可能有删除空格的选项。