【问题标题】:XSLT: Control call-templaterecursion depending upon recursion resultXSLT:根据递归结果控制调用模板递归
【发布时间】:2011-12-26 10:04:13
【问题描述】:

我有一个带递归的 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。如果我可以从较早的递归中更新参数的值,它将对我有所帮助。但是我该怎么做呢?

编辑:

我在这里添加一些构建源 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 这样的密钥,我从某个根目录开始。根是带有&lt;type&gt;Application_Provider&lt;/type&gt; 的元素,查看所有&lt;own_slot_value&gt;,我得到&lt;value value_type="simple_instance"&gt; 并获取值。如果我没有找到,我会带着值去&lt;name&gt;..&lt;/name&gt; 的元素。我以这种方式继续搜索。

【问题讨论】:

  • 请提供一个完整的(但很小的)源 XML、想要的结果,并解释转换应该做什么。这就是定义问题的原因。考虑到所有这些必要的信息,我很乐意提供解决方案。
  • 另外,什么是“腿”?我还没有在图论中看到过这样的术语。你是说路径吗?图是有向图还是无向图?请提供图形(小)xml 表示的实例。
  • @DimitreNovaatchev:基本上在任何情况下,每个节点都有多个关系导致不同的节点。我将每个从节点到连接节点的路径描述为“腿”。
  • @Kanghan:这仍然是个谜。你的意思是“腿”只是一个“弧线”吗?
  • @Kanghan:这个问题太笼统了,没有图形表示的具体示例/实例,也没有提供想要的结果。我一般不会花时间在这样的“问题”上。缺乏细节通常意味着提问者不知道他们在问什么……如果您希望人们提供有用的、可行的解决方案,请改进这个问题。

标签: xml xslt xpath xslt-2.0


【解决方案1】:

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 以更新参数变量 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>

我觉得这应该可行。试试这个,让我知道。

【讨论】:

  • 但是如何在下一次递归中将它传递给同一个模板?
  • @kangkan:我已经更新了我的答案。我觉得这会对你有所帮助。试试这个,让我知道..
  • 无阳性结果。这不会产生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多