2014-02-06 1 views
0

Мои XML данные должны выглядеть следующим образом:Schematron: Элемент внутри смешанного типа элемента только с другим содержанием

<mixed_type_parent> 

...text... 

    <other_element1/> 
    <other_element2/> 

    <element_in_question>...some content...</element_in_question> 

    <other_element2>...text...</other_element2> 
    <other_element1>...text...</other_element1> 

...text... 
</mixed_type_parent> 

То, что я хочу, чтобы убедиться, что с помощью Schematron является то, что «element_in_question» может появиться только в пределах «mixed_type_parent «если есть какой-то текст вне« element_in_question ». Это означает, что

<mixed_type_parent> 
    <element_in_question>...some content...</element_in_question> 
</mixed_type_parent> 

не допускается и должно привести к ошибке.

Я попытался получить строку длины всего текста непосредственно в «mixed_type_parent»

string-length(replace(ancestor::mixed_type_parent[1]/text(),' ', '')) 

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

В XSLT Я решил эту проблему простейшей функции вы можете думать о:

<xsl:function name="locfun:make_string"> 
<xsl:param name="input_sequence"/> 
<xsl:value-of select="$input_sequence"/> 
</xsl:function> 

(это Reall жаль, что там нет такой встроенной функции в XPath.)

Но как я могу использовать эту функцию в Schematron? Я не нашел для этого решения.

И кроме этого: Как получить всю текстовую форму для всех остальных дочерних элементов "mixed_type_parent", кроме "mixed_type_parent"?

ответ

2

Попробуйте это:

string-join(ancestor::mixed_type_parent[1]/text(),'')='' 

Для вашего второго вопроса: Как получить всю текстовую форму для всех остальных дочерних элементов "mixed_type_parent", кроме "mixed_type_parent"?

/mixed_type_parent/*[not(self::element_in_question)]/text() 
+0

Иногда я не понимаю XPath. Я попробовал concat(), потому что это более удобно и получило ошибку. Но работает string-join(). Я просто не понимаю, почему так. Но спасибо вам большое! – cis

+0

В этом случае concat ожидает несколько аргументов, каждая из которых представляет строку, поэтому вам нужно будет узнать количество строк, которые вы хотите выполнить перед рукой, тогда как string-join ожидает последовательность строк и разделителя и, в основном, зацикленный конкат для вас. –

0

рассматривает этот входной XML,

<mixed_type_parent> 
    <element_in_question>...some content...</element_in_question> 
</mixed_type_parent> 

при применении этого XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

<xsl:strip-space elements="*"/> 

    <xsl:template match="element_in_question"> 
     <xsl:choose> 
      <xsl:when test="preceding-sibling::text() or following-sibling::text()"> 
       true 
      </xsl:when> 
      <xsl:otherwise> 
       false 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

производит

false 
+1

Это не помогает в его вопросе о schematron –