Xml 让我的外循环意识到内循环的存在
我想我的标题基本上描述了我现在在XSLT中所坚持的内容,但更准确地说,我的意思是“如何让外部循环意识到内部循环在XSLT中执行或不执行”。请原谅,我是这个领域的初学者Xml 让我的外循环意识到内循环的存在,xml,xslt,loops,Xml,Xslt,Loops,我想我的标题基本上描述了我现在在XSLT中所坚持的内容,但更准确地说,我的意思是“如何让外部循环意识到内部循环在XSLT中执行或不执行”。请原谅,我是这个领域的初学者 <xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]"> <Inner> <HL> <HL01>
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]">
<Inner>
<HL>
<HL01>
<xsl:number value ="position()+$Hcount"/>
</HL01>
....
首先,我的初始xml是空白的,我的XSLT基本上是从大量xml数据文件中获取数据,并创建一个结果xml文件,其中包含我想要的标记。具体来说,我所关心的问题发生在两个模板“外部”和“内部”,这两个模板实际上是循环结构本身,它们试图循环遍历特定xml文件的每一行。流的控制是直截了当的:我在主XSLT中调用Outer,然后输入Outer的“for each”循环,在这个Outer的每次运行中,我将调用“Inner”,因此它是一个循环中的循环结构
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]">
<Inner>
<HL>
<HL01>
<xsl:number value ="position()+$Hcount"/>
</HL01>
....
现在,我们可以忽略所有其他事情,但只知道一旦我进入外部循环,我将创建一个“HL”段,然后调用内部并进入内部循环,对于内部的每次运行,我也将创建一个“HL”段。需要注意的一点是,除非满足某些标准,否则无法输入INTERNAR,因此可能存在根本不输入INTERNAR的情况,并且所有HL段都是在外部单独创建的
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]">
<Inner>
<HL>
<HL01>
<xsl:number value ="position()+$Hcount"/>
</HL01>
....
这就是我想计算的HL段,我将分享一小部分代码,让您有一个想法
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]">
<Inner>
<HL>
<HL01>
<xsl:number value ="position()+$Hcount"/>
</HL01>
....
外环:
<xsl:template name="Outer">
<xsl:for-each select="$rechca//d_claim_rechca_export_xml_row">
<xsl:variable name="rechca_claim_no" select=claim_number/>
<HL01>
<xsl:if test="$indicator=0">
<xsl:value-of select="position()+1>
</xsl:if>
</HL01>
....
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row">
<xsl:if test="claim_number=$rechca_claim_number">
<xsl:call-template name="Inner">
<xsl:with-param name="HLcounter" select="position()+1"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]">
<Inner>
<HL>
<HL01>
<xsl:number value ="position()+$Hcount"/>
</HL01>
....
不需要解释命令式和声明式范式之间的差异的最简单的解决方案是两阶段转换。此样式表:
<xsl:for-each select="$rechcf//d_claim_rechcf_export_xml_row[claim_number =$claimno and sequence_number = 1]">
<Inner>
<HL>
<HL01>
<xsl:number value ="position()+$Hcount"/>
</HL01>
....
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:template match="/">
<xsl:variable name="vRTF-FirstPass">
<Outer>
<HL>
<HL01/>
</HL>
<Inner>
<HL01/>
</Inner>
<HL>
<HL01/>
</HL>
</Outer>
</xsl:variable>
<xsl:apply-templates
select="msxsl:node-set($vRTF-FirstPass)/node()"
mode="second-pass"/>
</xsl:template>
<xsl:template match="node()|@*" mode="second-pass">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="second-pass"/>
</xsl:copy>
</xsl:template>
<xsl:template match="HL01" mode="second-pass">
<xsl:copy>
<xsl:variable name="vPosition">
<xsl:number level="any"/>
</xsl:variable>
<xsl:value-of select="$vPosition + 1"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
@Robert:只要提供您的源XML文档(尽可能少)和想要的结果,并解释任何必须遵守的规则——然后我们将向您展示一个解决方案。你的主要问题是,你作为一个命令式语言程序员在思考,你试图实现不可能的解决方案,甚至不知道如何找到一个更简单、功能更强大的解决方案。@Dimitre:问题是,代码太长了。我可以给你发电子邮件吗?罗伯特:我们不需要“密码”。我们需要一个简单的XML文档和想要的结果,以及问题的简短定义(规则、约束等)。没有人会“纠正”在函数设置中根本无法纠正的命令式代码。@Dimitre:希望现在更好。@Robert:不完全是这样:不清楚如何生成内部循环后的输出--您显示的代码中没有这一点。正如我之前所说的,我们根本没有也不应该讨论您的代码——特别是当您没有解释它应该做什么的时候。@Alejandro:效果很好。我认为两阶段翻译是在xslt中计算段的一个很好的解决方法。@Robert:我很高兴它很有帮助。正确地说,这是函数组合,如(fog)(x)=f(g(x))
所示。它不是一种变通方法,而是声明性范式中的一种基本模式。