Доступ к переменным в рекурсивных функциях - PullRequest
1 голос
/ 27 мая 2011

Я создаю рекурсивную функцию XSLT, которая запускает все дочерние файлы Xml.

<xsl:call-template name="testing">
  <xsl:with-param name="root" select="ItemSet"></xsl:with-param>
</xsl:call-template>

Во время работы XSLT мне нужно получить значение корневого узла переменной, где я нахожусь потому что при вызове корневой переменной я получаю узел со всеми дочерними узлами, но все, что мне нужно, это одно значение узла, и, поскольку оно является рекурсивным, я не могу воздействовать на теги дочерних узлов, потому что он всегда изменяется. Итак, как я могу получить переменную одно конкретное значение в любое время? Ни $root, ни " . " не работает.

XSL код:

<xsl:variable name="trial" select="count(./*)"></xsl:variable>
<xsl:choose>
  <xsl:when test="count(./*) = 0">


    :<xsl:value-of select="$root" /> <br/>


  </xsl:when>
  <xsl:otherwise>



         <xsl:for-each select="./*">

        <xsl:call-template name="testing">
          <xsl:with-param name="root" select=".">

          </xsl:with-param>
        </xsl:call-template>

    </xsl:for-each>
  </xsl:otherwise>
</xsl:choose>

XML-код:

<ItemSet>
  <Item>
    1
    <iteml1>
      1.1
    </iteml1>
    <iteml1>
      1.2
    </iteml1>
  </Item>

  <Item>
    2
    <iteml1>
      2.1
      <iteml2>
        2.1.1
      </iteml2>
    </iteml1>
  </Item>
</ItemSet>

что делать, если вместо строки кода * поставить строку кода:

1
1: 1.1 :
1: 1.2
2
2: 2.1
2: 2.1: 2.1.2

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

Требуемая обработка может быть реализована эффективно и без явной рекурсии:

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

 <xsl:template match="*[parent::*]">
   <xsl:param name="pPath"/>
     <xsl:value-of select="$pPath"/>

  <xsl:variable name="vValue" select=
   "normalize-space(text()[1])"/>
  <xsl:value-of select="$vValue"/> <br/>

    <xsl:apply-templates select="*">
     <xsl:with-param name="pPath" select=
      "concat($pPath, $vValue, ': ')"/>
    </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML:

<ItemSet>
    <Item>
     1
        <iteml1>
         1.1
        </iteml1>
        <iteml1>
         1.2
        </iteml1>
    </Item>

 <Item>
    2     
        <iteml1>
         2.1       
            <iteml2>
             2.1.1
            </iteml2>
        </iteml1>
    </Item>
</ItemSet>

желаемый результат получен :

1<br/>1: 1.1<br/>1: 1.2<br/>2<br/>2: 2.1<br/>2: 2.1: 2.1.1<br/>

и отображается в браузере как :

1
1: 1.1
1: 1,2
2
2: 2.1
2: 2.1: 2.1.1

0 голосов
/ 27 мая 2011

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

В противном случае вам нужно будет сделать следующее:иметь два параметра, один из которых передается точно так же, как и при каждом вызове, поэтому, помимо вызова <xsl:with-param name="root" select="." />, вы также добавляете <xsl:with-param name="baseroot" select="$baseroot" /> и определяете <xsl:param name="baseroot" select="$root" /> непосредственно под <xsl:param name="root" />.Затем вы можете использовать $ baseroot вместо $ root везде, где вам нужно исходное значение, которое было передано вверху стека.

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