带有XML根节点数据的foreach循环

时间:2017-01-29 04:55:18

标签: xslt

在使用XSLT时,我遇到了带有XML根节点数据的foreach循环的问题。

从XML下面,我只需要有一个DiagnosisPosition =“BF13 | 14”

,我需要提取一个额外的HI段(带BF13和BF14值)

XML:

<?xml version="1.0"?>
<root>
    <ns0:Diagnosis DiagnosisPosition="BF01|02" CodeList="BF" DiagnosisCode="1" PresentOnAdmission="Y" LCR_CD="" />
    <ns0:Diagnosis DiagnosisPosition="BF01|02" CodeList="BF" DiagnosisCode="5" PresentOnAdmission="Y" LCR_CD="" />
    <ns0:Diagnosis DiagnosisPosition="BF02|03" CodeList="BF" DiagnosisCode="12" PresentOnAdmission="" LCR_CD="" />
    <ns0:Diagnosis DiagnosisPosition="BF13|14" CodeList="BF" DiagnosisCode="13" PresentOnAdmission="Y" LCR_CD="" />
    <ns0:Diagnosis DiagnosisPosition="BF14|15" CodeList="BF" DiagnosisCode="14" PresentOnAdmission="Y" LCR_CD="" />
</root>

使用XSLT:

<xsl:variable name="var:v334" select="userCSharp:StringSubstring(string(s0:Diagnosis/@DiagnosisPosition) , &quot;1&quot; , &quot;4&quot;)" />    
<xsl:variable name="var:v335" select="userCSharp:LogicalEq(string($var:v334) ,&quot;BF13&quot; )" />    
<xsl:if test="$var:v335">
    <xsl:for-each select="s0:Diagnosis">
        <xsl:variable name="var:v33611" select="string(@DiagnosisPosition)" />
        <xsl:variable name="var:v33711" select="userCSharp:StringSubstring($var:v33611 , &quot;1&quot; , &quot;4&quot;)" />
        <xsl:variable name="var:v33811" select="userCSharp:LogicalEq(string($var:v33711) , &quot;BF13&quot;)" />            
        <xsl:if test="$var:v33811">                
            <ns0:HI_OtherDiagnosisInformation>
                <xsl:for-each select="s0:Diagnosis">
                    For each loop is not working. Scope of this foreach loop is lost and goes to the root foreach loop.                        
                    <xsl:variable name="var:v336" select="string(@DiagnosisPosition)" />
                    <xsl:variable name="var:v337" select="userCSharp:StringSubstring($var:v336 , &quot;1&quot; , &quot;4&quot;)" />
                    <xsl:variable name="var:v338" select="userCSharp:LogicalEq(string($var:v337) , &quot;BF13&quot;)" />
                    <xsl:if test="$var:v338">
                        --Writing values of CodeList and Diagnosis codes
                    </xsl:if>
                    <xsl:variable name="var:v345" select="string(@DiagnosisPosition)" />
                    <xsl:variable name="var:v346" select="userCSharp:StringSubstring($var:v345 , &quot;1&quot; , &quot;4&quot;)" />
                    <xsl:variable name="var:v347" select="userCSharp:LogicalEq(string($var:v346) , &quot;BF14&quot;)" />
                    <xsl:if test="$var:v347">
                        --Writing values of CodeList and Diagnosis codes
                    </xsl:if>
                </xsl:for-each>
            </ns0:HI_OtherDiagnosisInformation>
        </xsl:if>
    </xsl:for-each>
</xsl:if>

我只需要在有BF13,BF14元素而不是HI段时提取额外的HI段。

我尝试了很多方法但无法使其工作并需要一些帮助/建议。

非常感谢任何帮助。

感谢您并期待回复。

1 个答案:

答案 0 :(得分:0)

如果真的需要两个嵌套循环,两个循环遍历所有Diagnosis个元素, 然后内部循环应该具有以下形式:

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

显然你忘了循环中的当前元素(.)是每个元素 来自select条款中所述的序列。

我认为,你不需要内循环。

您写道,您需要为某些Diagnosis提取其他信息 元素,仅当他们的DiagnosisPosition BF13 BF14 开头。

所以也许一个循环就足够了?

而不是内循环你应该:

  • 读取DiagnosisPosition值(仅在您的示例中读取两次,在2个不同的变量下)。
  • <xsl:if ...>检查此值是否以 BF13 BF14 开头。
  • 在此if
  • 中添加其他输出

或者,如果 “数字”(来自DiagnosisPosition的字符3-4或6-7,(之前或之后的2个字符),则输出此额外的输出数据段|“))是13还是14?

在这种情况下,相应地更改test条件。