2016-07-19 1 views
3

У меня есть этот простой XML-документXPath в пределах XSLT дает различный результат от прямой оценки XPath

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://example.org/attributes"> 
    <record> 
     <codice_fiscale>IT07654930130</codice_fiscale> 
     <indirizzo tipo="casa">Viale Carlo Espinasse 5, Como</indirizzo> 
    </record> 
    <n:record xmlns:n="http://test.com/records"> 
     <n:codice_fiscale>IT87654770157</n:codice_fiscale> 
     <n:indirizzo tipo="ufficio">Via Biancospini 20, Messina</n:indirizzo> 
    </n:record> 
    <record> 
     <codice_fiscale>IT471142131</codice_fiscale> 
     <indirizzo tipo="ufficio">Via Chiasserini 88B, Firenze</indirizzo> 
     <test> 
      <nummeroo>01-000-000</nummeroo> 
      <nummeroo>02-000-000</nummeroo> 
     </test> 
     <test> 
      <nummeroo>03-000-000</nummeroo> 
      <nummeroo>04-000-000</nummeroo> 
     </test> 
     <stuff>other stuff</stuff> 
    </record> 
    <things> 
     <nummero>08-000-000</nummero> 
     <nummero>09-000-000</nummero> 
    </things> 
</root> 

В следующем XSLT 2.0 таблицы стилей должны вывести имена всех элементов, которые имеют по меньшей мере один лист-узел в виде ребенок.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="no" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="//*[child::*[not(*)]]"> 
     <xsl:value-of select="concat(name(), '&#xa;')" /> 
    </xsl:template> 
</xsl:stylesheet> 

Я использую omit-xml-declaration и я раздеться алле пропуски, чтобы получить простой текстовый документ. Конкатенация с '&#xa;' дает мне новую строку.

Применительно к упомянутой выше XML документа XSLT дает следующий результат

record 
n:record 
record 
things 

Используя выражение XPath 2.0 шаблона внутри таблицы стилей, т.е.

//*[child::*[not(*)]] 

в сочетании с именем (), чтобы получить название элемента в виде строки, то есть

//*[child::*[not(*)]]/name() 

I получаем следующий результат (с использованием различных редакторов/XPath 2.0 оценщиками)

record 
n:record 
record 
test 
test 
things 

Используя таблицу стилей XSLT 2.0 и непосредственно вычисления выражения XPath 2.0 с редактором урожайности различных результатов!

Я ожидаю, что результаты будут точно такими же. Таблица стилей и прямая оценка xpath //*[child::*[not(*)]]/name() очень важны и должны обеспечивать одинаковый вывод текста.

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

У кого-нибудь есть идея, почему две оценки дают разные результаты?

ответ

3

A совпадение рисунок не то же самое, что и выражение.

Что происходит с таблицей стилей заключается в следующем:

  • Во-первых, встроенные шаблонные правила применяются к / корневого узла.

  • Затем, используя встроенную рекурсию, те же встроенные шаблоны применяются к корневому элементу root.

  • Далее, ваш шаблон запускает и обрабатывает узлы, являющиеся дочерними элементами корневого элемента, - и здесь обработка останавливается, потому что ваш шаблон не содержит инструкции xsl:apply-templates.

Обратите внимание, что ведущий // игнорируется в шаблоне соответствия.

+0

Спасибо за полезное объяснение Майкл. Кажется, мне все еще нужно много узнать о xslt. – Newbee

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