2013-12-03 4 views
1

У меня есть инструкция 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.

Благодаря

ответ

3

В XSLT 1.0, когда вы передаете набор узлов более одного узла к функции, ожидающей одну строку, он просто использует значение строки первого узла в наборе и игнорирует остальные. В XSLT 2.0 функция substring-after ожидает, что ее аргументы будут xs:string?, то есть нуль или одна строка, поэтому, если вы передадите ей последовательность с более чем одним элементом, это вызовет ошибку несоответствия типа.

Я полагаю, что ./title/content-style/text() выбирает более одного узла, т.е. есть больше чем один title, более чем один content-style и/или более чем один текстовый узел в пределах content-style элемента.

Рассмотрим ли вы на самом деле нужно использовать text() здесь все - вам действительно нужно обрабатывать каждый текстовый узел ребенка content-style индивидуально, или вы просто хотите строковое значение content-style элемента в целом? Если первое, вам нужно что-то вроде title/content-style/text()/substring-before(., ' ') (которое работает только в 2.0), если последнее, попробуйте просто сказать substring-after(title/content-style, ' ').

0

Я была такая же проблема, но для меня, оказалось, что в то время как моя схема, для рассматриваемого элемента, имел кратность optional установку, она не имеет настройки unbounded и ввода данных я использую имел 2 элемента, где он ожидал 0 ... 1

Смежные вопросы