XSLT: использование переменной тега шаблона и условия разрыва в цикле for-each - PullRequest
0 голосов
/ 12 января 2010

Я использую XSLT, где я создал тег <xsl:template>, который выполняет некоторую проверку с использованием оператора <xsl:for-each> и устанавливает значение <xsl:variable> или <xsl:param> в значение true или false.

  1. Есть ли способ разорвать оператор for for each, если условие истинно?
  2. Можем ли мы использовать значение переменной Template или param из основной вызывающей подпрограммы?

Пример:

<!-- Main Xslt -->
<xsl:template>
  <xsl:call-template name ="TestTemplate">
    <!--  
      Here I want to use the variable or param that 
      is defined in TestTemplate, is it possible?
    -->
  </xsl:call-template>
</xsl:template>

<xsl:template name ="TestTemplate">
  <xsl:param name="eee"/>
  <xsl:for-each select ="//RootNode/LeafNode">
    <xsl:choose>
      <xsl:when test ="@Type='ABC'">
        <xsl:value-of select ="true"/>
      </xsl:when>
      <xsl:otherwise>false</xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</xsl:template>

Ответы [ 2 ]

3 голосов
/ 12 января 2010

На ваши вопросы:

Есть ли способ разорвать оператор for for each, если условие истинно?

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

То, что вы, казалось бы, хотите сделать, это выразить "найти первое <LeafNode>, где @Type='ABC', и вернуть true или false в зависимости от того, существует ли он.

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

В XSLT вы просто выбираете узел с XPath:

//RootNode/LeafNode[@Type='ABC']

либо результат этого содержит узел, либо его нет. Нет необходимости для каждого на всех.

Можем ли мы использовать значение переменной Template или param из основной вызывающей подпрограммы?

Нет. Переменные и параметры строго ограничены. Они выходят из области видимости после обработки, оставляя их родительский элемент. Они также являются постоянными, как только они объявлены, они не могут быть изменены.

Способ сделать то, что вы хотите здесь, это сделать шаблон вывести желаемое значение и записать его в переменную:

<xsl:template>
  <xsl:variable name="returnValue">
    <xsl:call-template name="TestTemplate" />
  </xsl:variable>
</xsl:template>

<xsl:template name="TestTemplate">
  <!-- the following expression emits true or false -->
  <xsl:value-of select="
    count(//RootNode/LeafNode[@Type='ABC']) gt; 0
  " />
</xsl:template>

Два последних совета:

  • Избегайте оператора '//' любой ценой. Большую часть времени его использование не является необходимым
  • первый, самый верхний элемент в документе - это не «корневой узел», это «элемент документа»

Это важное различие. «Корневой узел» ставится перед элементом документа, поэтому приведенный выше XPath должен выглядеть примерно так (семантически):

/DocumentElement/LeafNode
^------ *this* slash represents the "root node"
0 голосов
/ 12 января 2010

объявление 1. Я думаю, что это невозможно, но я не уверен

ad 2. Да, вы можете использовать параметр, но обратите на него внимание, потому что он постоянный. Все переменные и параметры в XSL являются константами. Посмотрите на W3School - переменная

цитируют:

Как только вы установите значение переменной, вы не сможете изменить или изменить это значение!

То же самое относится и к параметрам.

Вы можете вызвать шаблон с (постоянным) параметром:

<call-template name="myTemplate">
   <xsl:with-param name="name" select="expression">
</call-template>

Посмотрите на W3School - с параметром это действительно хорошая справочная страница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...