版本更改时令人困惑的声明

时间:2013-12-03 11:38:03

标签: xslt xslt-1.0 xslt-2.0

我有下面的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')

请让我知道在XSL 2.0中XSL1.0中出现了什么问题。

由于

2 个答案:

答案 0 :(得分:3)

在XSLT 1.0中,当您将一个以上节点的节点集传递给需要单个字符串的函数时,它只使用集合中 first 节点的字符串值并忽略其余的。在XSLT 2.0中,substring-after函数期望其参数为xs:string?,即零或一个字符串,因此如果您传递一个包含多个项的序列,则会导致类型不匹配错误。

我认为./title/content-style/text()选择了多个节点,即title中有多个content-style,多个content-style和/或多个文本节点} element。

考虑一下你是否真的需要在这里使用text() - 你真的需要单独处理content-style的每个文本节点子节点,还是只需要{{1}的字符串值?元素作为一个整体?如果是前者,则需要content-style(仅适用于2.0),如果是后者,请尝试说title/content-style/text()/substring-before(., ' ')

答案 1 :(得分:0)

我遇到了同样的问题,但对我来说,事实证明,虽然我的架构对于相关元素具有多重optional设置,但它没有unbounded设置,并且我使用的输入数据有2个元素,期望0 ... 1