Почему XSLT производит весь текст по умолчанию?

Привет я выполнил преобразование, которое отбрасывает тег, если это является пустым.

Я хотел проверить, хорошо работает ли мое преобразование, таким образом, вместо того, чтобы проверить его вручную, я написал еще один код XSLT, который просто проверяет присутствие того конкретного тега в ВЫВОДЕ XML, если это является пустым, затем второй XSLT должен произвести "НАЙДЕННЫЙ" текст. (Мне на самом деле не нужен некоторый вид XML вывода, но я просто использую XSLT для поиска.)

Когда я попробовал этим кодом XSL::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']">
      FOUND
  </xsl:template>
</xsl:stylesheet>

Это производит все ТЕКСТОВЫЕ ДАННЫЕ, которые присутствуют в XML-файле,

чтобы избежать, чтобы, я должен был написать этот код::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']">
      FOUND
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>

почему первый кодировал выходной ТЕКСТ, почему я должен настоять XSL для игнорирования всего другого текста? это поведение всех синтаксических анализаторов XML или только мой собственный (я использую msxml синтаксический анализатор).

71
задан Dimitre Novatchev 30 June 2019 в 20:27
поделиться

2 ответа

почему предыдущий код выводил ТЕКСТ, почему я должен настаивать на том, чтобы XSL игнорировал все другой текст? в том, что поведение все синтаксические анализаторы XML или только мои собственные

Вы открываете для себя одну из самых фундаментальных функций XSLT, как указано в Спецификации: встроенные шаблоны XSLT .

Из спецификации :

Существует встроенный шаблон правила для разрешить рекурсивную обработку продолжить при отсутствии удачного рисунка соответствие явному правилу шаблона в таблица стилей. Это правило шаблона применяется как к узлам элемента, так и к корневой узел. Ниже показаны эквивалент встроенного шаблона правило:

 
 

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

 
 

Также есть встроенный шаблон правила для узлов текста и атрибутов, которые копирует текст через:

 
 

Встроенный шаблон правила для инструкции и комментарии по обработке ничего не делать.

 

Встроенный шаблон правила для узлы пространства имен также ничего не делать. Нет шаблона, который мог бы соответствовать узел пространства имен; Итак, встроенный правило шаблона - единственный шаблон правило, применяемое к пространству имен узлы.

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

Итак, сообщаемое поведение является результатом применения встроенных шаблонов - 1-го и 2-го из всех трех.

Хорошим шаблоном проектирования XSLT является переопределение встроенных шаблонов собственными, которые будут выдавать сообщение об ошибке при каждом вызове, чтобы программист сразу знал, что его преобразование «просачивается»:

Например , если есть этот XML-документ:

<a>
  <b>
    <c>Don't want to see this</c>
  </b>
</a>

, и он обрабатывается с помощью этого преобразования :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="a|b">
   <xsl:copy>
      <xsl:attribute name="name">
        <xsl:value-of select="name()"/>
      </xsl:attribute>
      <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

, результат будет :

<a name="a">
   <b name="b">Don't want to see this</b>
</a>

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

Однако простое добавление этого универсального шаблона помогает избежать такой путаницы и немедленно выявлять ошибки :

 <xsl:template match="*">
  <xsl:message terminate="no">
   WARNING: Unmatched element: <xsl:value-of select="name()"/>
  </xsl:message>

  <xsl:apply-templates/>
 </xsl:template>

Теперь, помимо сбивающего с толку вывода, программист получает предупреждение, которое немедленно объясняет проблему :

 WARNING: Unmatched element: c

Позднее добавление Майкла Кея для XSLT 3.0

В XSLT 3.0 вместо добавления универсального шаблона правила вы можете указать резервное поведение в объявлении xsl: mode . Например, вызывает пропуск всех несопоставленных узлов (включая текстовые узлы), а рассматривает несоответствие как ошибку, а приводит к предупреждение.

146
ответ дан 24 November 2019 в 12:57
поделиться

В XSL есть несколько встроенных правил шаблона, одно из которых следующее:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

Он выводит текст.

14
ответ дан 24 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: