XSLT: управление вызовом-шаблоном рекурсии в зависимости от результата рекурсии - PullRequest
1 голос
/ 26 декабря 2011

У меня XSLT с рекурсией, и я вызываю рекурсию внутри цикла for-each

<xsl:for-each select="$ChildList">
    <!-- Get the new elNodeList here and recurse -->
    <xsl:variable name="inp" select="current()"></xsl:variable>
    <xsl:variable name="NewNode" select="/node()/pro:simple_instance[pro:name=$inp]"></xsl:variable>
    <xsl:variable name="uniqueNode" select="$NewNode/pro:name except ($BeatenPath)"></xsl:variable>
    <xsl:if test="count($uniqueNode) > 0"> 
        <xsl:call-template name="Recurse2Find">
            <xsl:with-param name="AppNode" select="$AppNode"></xsl:with-param>
            <xsl:with-param name="elNode" select="$NewNode"></xsl:with-param>
            <xsl:with-param name="thisProduct" select="$thisProduct"></xsl:with-param>
            <xsl:with-param name="BeatenPath" select="$BeatenPath|$NewNode/pro:name"></xsl:with-param>
            <xsl:with-param name="rev" select="$rev+1"></xsl:with-param>
            <xsl:with-param name="Found" select="0"></xsl:with-param>
        </xsl:call-template>
    </xsl:if>
</xsl:for-each>

Я в основном ищу что-то в графе, и я иду вниз на один уровень графа в каждой рекурсии, в то время как я следую за разными ветвями графа в каждой итерации в цикле for-each.

Если я найду предмет, который ищу, в каком-либо из участков, я хочу прекратить дальнейший поиск этого корня.

Я могу вернуть значение из шаблона вызова, но не знаю, как его реализовать и добавить его в качестве параметра далее. Параметр Found в шаблоне будет воспроизводиться иначе. Если я смогу обновить значение параметра из предыдущей рекурсии, это поможет мне. Но как я могу это сделать?

EDIT:

Я добавляю некоторые элементы XML, которые создают исходный XML, здесь:

<simple_instance>
    <name>KB_249702_Class31</name>
    <type>Technology_Build_Architecture</type>
    <own_slot_value>
        <slot_reference>contained_architecture_components</slot_reference>
        <value value_type="simple_instance">KB_249702_Class32</value>
        <value value_type="simple_instance">KB_181699_Class96</value>
        <value value_type="simple_instance">KB_181699_Class97</value>
        <value value_type="simple_instance">KB_692833_Class51</value>
        <value value_type="simple_instance">KB_692833_Class52</value>
    </own_slot_value>
    <own_slot_value>
        <slot_reference>contained_provider_architecture_relations</slot_reference>
        <value value_type="simple_instance">KB_181699_Class98</value>
        <value value_type="simple_instance">KB_692833_Class54</value>
        <value value_type="simple_instance">KB_692833_Class55</value>
    </own_slot_value>
    <own_slot_value>
        <slot_reference>describes_technology_provider</slot_reference>
        <value value_type="simple_instance">KB_249702_Class30</value>
    </own_slot_value>
    <own_slot_value>
        <slot_reference>name</slot_reference>
        <value value_type="string">HHS Modernization Arch::Product_Architecture</value>
    </own_slot_value>
</simple_instance>

Я ищу какой-то ключ, такой как KB_249702_Class30, и я начинаю с какого-то рута. Корень - это такой элемент с <type>Application_Provider</type>, посмотрите на все <own_slot_value>, где я получу <value value_type="simple_instance"> и заберу значение. Если я не нахожу, я иду к элементу с <name>..</name> со значением. Я продолжаю поиск таким образом.

1 Ответ

1 голос
/ 26 декабря 2011

Сохраните значение Recurse2Find шаблона в переменной RecurseResult

<xsl:variable name="RecurseResult">
    <xsl:call-template name="Recurse2Find">
        <!-- Do your stuff -->
    </xsl:call-template>
</xsl:variable> 

РЕДАКТИРОВАТЬ:

Примечание. Поскольку у меня меньше времени,не проверял это.

Выполните следующие шаги для реализации: -

Шаг 1: Объявите переменную Param с фиктивным значением сверху

<xsl:param name="rResult" select="0" />

Шаг 2: После сохранения значения в RecurseResult переменная

  <xsl:variable name="RecurseResult">
     <xsl:call-template name="Recurse2Find">
          <xsl:with-param name="temp" select="$rResult"/>
          <!-- Do your stuff -->
     </xsl:call-template>
  </xsl:variable> 

  Note: for the first time, rResult has dummy value.

Шаг 3: Передача RecurseResult значение переменной для еще одного шаблона вызова ParamUpdate для обновления переменной param rResult .

<xsl:call-template name="ParamUpdate">
    <xsl:with-param name="temp" select="$RecurseResult"/>
</xsl:call-template>

Шаг 4: Шаблон вызова обновит переменную param следующим образом.

<xsl:template name="ParamUpdate">
    <xsl:param name="temp" />
    <xsl:param name="rResult" select="$temp"/>
</xsl:template>

Мне кажется, это должно сработать.Попробуйте и дайте мне знать.

...