XSLT Получение двух разных выходных данных для одного и того же входного XML для одного и того же XSL
Я пробовал свой XSLT-код в онлайн-инструменте [XSLT 1.0 процессор]:
http://www.freeformatter.com/xsl-transformer.html
Недавно мне пришлось воспользоватьсяxs:dateTime
и, следовательно, начал использовать инструмент, который используетПроцессор XSLT 2.0, http://xsltransform.net/
Теперь, когда я пытался решить проблему, я вижу, что я получаю разные выходные данные для одного и того же входного XML в этих двух процессорах. Код, размещенный здесь, не является реальным кодом, над которым я работаю; это для имитации странного вывода, с которым я столкнулся.
XML:
<?xml version="1.0" encoding="UTF-8"?>
<items>
<book>
<title></title>
</book>
<phone>apple</phone>
</items>
XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:template match="/">
<items><xsl:apply-templates select="items/*" /></items>
</xsl:template>
<!-- ignore empty elements -->
<xsl:template match="*[not(normalize-space())]" />
<xsl:template match="book">
<newbook><xsl:apply-templates /></newbook>
</xsl:template>
<xsl:template match="title">
<newtitle><xsl:apply-templates /></newtitle>
</xsl:template>
<xsl:template match="phone">
<newphone><xsl:apply-templates /></newphone>
</xsl:template>
</xsl:stylesheet>
Выход изhttp://xsltransform.net/
: [вывод 1]
<?xml version="1.0" encoding="UTF-8"?>
<items>
<newbook>
<newtitle/>
</newbook>
<newphone>apple</newphone>
</items>
Выход изhttp://www.freeformatter.com/xsl-transformer.html
: [вывод 2]
<?xml version="1.0" encoding="UTF-8"?>
<items>
<newphone>apple</newphone>
</items>
ожидаемый выходной XMLoutput 2
.
Любая идея, почему это другое поведение вывода?
примечание: я посмотрел на другой вопрос так:Генерация двух разных выходов для одного и того же файла XSL?, но это не так.
редактировать
Чтобы добавить больше ясности в отношении того, какой инструмент произведен, какой вывод:
http://xsltransform.net/
произведенныйoutput 1
http://www.freeformatter.com/xsl-transformer.html
произведенныйoutput 2
Обновление [02/10/2014] - относительно решения
Так как правильный ответ был впервые предоставлен Джимом Гаррисоном, это помечено как ответ. Однако есть и другие важные моменты, на которые указывали другие, поэтому я все здесь и завершаю.
<xsl:template match="*[not(normalize-space())]" />
Приведенный выше шаблон устраняет пустые узлы в XSLT1 и XSLT2. следовательновывод 2 правильный
* Причина получениявыход 1 из инструмента -http://xsltransform.net/ : *
Как отметил @ michael.hor257k, есть два шаблона, которые соответствуют<book>
элемент.Инструмент использовал Saxon-HE 9.5.1.3, ивыход 1 поведение, вероятно, было ошибкой, которая была исправлена в последнем техническом выпуске [@Michael Kay хорошо объяснил в своем ответе]Как упомянул в своем ответе @Ian Roberts, существует концепция приоритетов по умолчанию, которые назначаются различным типам шаблонов. Изменение синтаксиса шаблона на:<xsl:template match="*[not(normalize-space())]" priority="2"/>
выдает одинаковый вывод в обоих инструментах независимо от саксонской версии, потому что мы явно определяем приоритет шаблона.