XSLT возвращается больше, чем предполагалось. [Дубликат]

Вместо этого вы можете передать его с помощью extra-vars .

Просто сделайте раздел hosts переменной, например {{ hosts_prompt }}, а затем передайте хост в командной строке например:

ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"

Или, если вы используете местоположение файла инвентаря по умолчанию в /etc/ansible/hosts, вы можете просто использовать:

ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"

67
задан Wayne Burkett 23 February 2011 в 21:37
поделиться

2 ответа

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

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

Из Spec :

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

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

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

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

Существует также встроенное правило шаблона для узлов текста и атрибута, которые копируют текст через:

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

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

<xsl:template match="processing-instruction()|comment()"/>

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

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

Таким образом, сообщаемое поведение является результатом применения встроенных шаблонов - 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>

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

Однако просто добавление этого параметра catch-all template помогает избежать любые такие путаницы и ошибки уловов сразу:

 <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
135
ответ дан Dimitre Novatchev 22 August 2018 в 06:26
поделиться
  • 1
    +1: Отличное объяснение - гораздо более полное, чем принятый ответ, хотя принятый ответ также отвечает на конкретный вопрос. – Don Roby 31 July 2010 в 16:22
  • 2
    @donroby: Спасибо. Почему мой ответ не будет затрагивать вопрос и отвечать на него? Любой, кто имеет эту проблему и читает мой ответ, поймет причину своей проблемы и сможет ее исправить. – Dimitre Novatchev 31 July 2010 в 17:17
  • 3
    @donroby: Мой ответ дает точный ответ: "So, the reported behavior is the result of the application of the built-in templates -- the 2nd of all three of them" – Dimitre Novatchev 31 July 2010 в 17:18
  • 4
    Да, ваш ответ также отвечает на конкретный вопрос. Не предполагал иначе. Цель заключалась в том, чтобы не осуждать принятый ответ. Я действительно предпочитаю ваш ответ. – Don Roby 31 July 2010 в 17:55
  • 5
    ya .. его полный комплект информации :) большое спасибо :) – InfantPro'Aravind' 5 August 2010 в 14:33

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

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

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

13
ответ дан Oded 22 August 2018 в 06:26
поделиться
  • 1
    спасибо, так оно специфично для конкретного парсера или вообще? – InfantPro'Aravind' 29 July 2010 в 07:43
  • 2
    Полагаю, его общее правило для всех парсеров сводится к его спецификации w3c. Хорошо, спасибо :) – InfantPro'Aravind' 29 July 2010 в 07:45
  • 3
    @infant programmer - это в спецификации, как вы отметили ... все синтаксические анализаторы XSL должны их реализовать. – Oded 29 July 2010 в 08:17
  • 4
    хорошо спасибо :) понял. – InfantPro'Aravind' 29 July 2010 в 15:40
  • 5
    Это конкретное встроенное правило выходит из специальных символов XML , то есть перезаписывает &amp; в исходном тексте на &amp;amp; на выходе. Чтобы этого избежать, добавьте disable-output-escaping="yes" в качестве атрибута к элементу <xsl:value-of>. – Jens 25 May 2016 в 00:54