我有下面的XSLT语句。
<xsl:value-of select="substring-after(
./title/content-style/text(),' ')" />
当我使用样式表版本 1 作为
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ntw="Number2Word.uri"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="ntw">
但是当我将其更改为 2.0 版时,如下所示。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ntw="Number2Word.uri"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="ntw">
它抛出以下错误
XSLT 2.0 Debugging Error: Error:
file:///C:/Users/u0138039/Desktop/Proview/HK/HKWB2014/XSLT%20and%20CSS/new_bull.xsl:202:
Wrong occurrence to match required sequence type -
Details: - XPTY0004: The supplied sequence ('2' item(s)) has
the wrong occurrence to match the sequence type xs:string ('zero or
one')
请让我知道 XSL1.0 中正确的方向在 XSL 2.0 中出了问题。
谢谢
在 XSLT 1.0 中,当您将包含多个节点的节点集传递给需要单个字符串的函数时,它只是使用该集中第一个节点的字符串值,而忽略其余节点。 在XSLT 2.0中,substring-after
函数期望其参数xs:string?
,即零个或一个字符串,因此,如果您向它传递一个包含多个项目的序列,则会导致类型不匹配错误。
我假设./title/content-style/text()
选择多个节点,即content-style
元素中有多个title
、多个content-style
和/或多个文本节点。
考虑一下你是否真的需要在这里使用 text()
- 你真的需要单独处理content-style
的每个文本节点子节点,还是你只需要整个content-style
元素的字符串值? 如果是前者,您需要类似 title/content-style/text()/substring-before(., ' ')
的东西(仅适用于 2.0(,如果是后者,请尝试只说 substring-after(title/content-style, ' ')
.
我遇到了同样的问题,但对我来说,事实证明,虽然我的架构,对于有问题的元素,具有多重性optional
设置,但它没有unbounded
设置,并且我使用的输入数据有 2 个元素,它期望 0...1