У меня 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>
со значением. Я продолжаю поиск таким образом.