2015-06-10 3 views
0

Я ниже XMLSubstring перед броском ошибки

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
<p>Industrial drawing: Any creative composition</p> 
    <p>Industrial drawing: Any creative<fn> 
      <fnn>4</fnn> 
      <fnt> 
      <p>ftn1"</p> 
      </fnt> 
     </fn> composition 
     </p> 
</body> 

и ниже XSL.

<xsl:template match="p"> 
    <xsl:choose> 
     <xsl:when test="contains(substring-before(./text(),' '),'Article')"> 
      <xsl:text>sect3</xsl:text> 
      <xsl:value-of select="./text()"/> 
     </xsl:when> 
     <xsl:when test="contains(substring-before(./b/text(),' '),'Section')"> 
      <xsl:text> Sect 2</xsl:text> 
      <xsl:value-of select="./text()"/> 
     </xsl:when> 
     <xsl:when test="contains(substring-before(./b/text(),' '),'Chapter')"> 
      <xsl:text> Sect 1</xsl:text> 
      <xsl:value-of select="./text()"/> 
     </xsl:when> 
     <xsl:otherwise> 

</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Вот мой XSL работает отлично для <p>Industrial drawing: Any creative composition</p> но ниже Case

<p>Industrial drawing: Any creative<fn> 
     <fnn>4</fnn> 
     <fnt> 
      <p>ftn1"</p> 
     </fnt> 
     </fn> composition 
</p> 

он бросает мне ошибку ниже.

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Proview/ASAK/DIFC/XSLT/tabel.xslt:38: 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') 

, пожалуйста, дайте мне знать, как я могу исправить это и получить требуемый текст.

Благодаря

+0

Не следует 'substring-before (./ text(), '')' be 'su bstring-before (./ text(), '') 'i.e подстрока перед ** пространством **? –

+0

Привет @ michael.hor257k, у меня небольшое сомнение, если у меня есть что-то вроде

Глава 12

, есть ли способ, что я могу получить текст без использования 'подстрок-перед тем (./ б/с/text(), '') 'i означает прямой тип, например, используя' * '. Спасибо – Rakesh

+0

Не отвечает ли Ян Ян Робертс эту возможность? –

ответ

1

p элемента в вашем примере есть несколько текстовых узлов, поэтому выражение ./text() создает последовательность. Вы не можете применить строчную функцию к последовательности; вы должны сначала преобразовать его в строку. Вместо того, чтобы:

test="contains(substring-before(./text(),' '),'Article')" 

попробовать:

test="contains(substring-before(string-join(text(), ''), ' '), 'Article')" 
+0

Большое спасибо, это сработало как шарм :) Еще раз спасибо – Rakesh

2

Второго p элемент в вашем примере XML имеет два текстовых узлов детей, одна из которых «Промышленного рисунка: Любые творческий» и другие содержит пробел , "композиция", новая линия и еще шесть пробелов. В XSLT 1.0 законно применять функцию, которая ожидает строку для аргумента, который представляет собой набор из нескольких узлов, поведение должно принимать значение первого узла и игнорировать все остальные. Но в 2.0 это ошибка несоответствия типа для передачи двух узлов функции, ожидающей единственного значения для ее параметра.

Но в этом случае я сомневаюсь, что вам действительно нужно использовать text() вообще - если все, что вы заботитесь о видят ли строка «статьи» происходит где-нибудь в пределах первого слова под p (в том числе, когда это вложено в другом элемент), то вы можете просто использовать .:

<xsl:when test="contains(substring-before(.,' '),'Article')"> 

(или еще лучше, использовать предикаты для разделения различных условий в их собственные шаблоны, с одним шаблоном соответствия «статьями» пунктами, другой согласующими «раздел» пунктами, и т.д. .)

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