在使用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) , "1" , "4")" />
<xsl:variable name="var:v335" select="userCSharp:LogicalEq(string($var:v334) ,"BF13" )" />
<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 , "1" , "4")" />
<xsl:variable name="var:v33811" select="userCSharp:LogicalEq(string($var:v33711) , "BF13")" />
<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 , "1" , "4")" />
<xsl:variable name="var:v338" select="userCSharp:LogicalEq(string($var:v337) , "BF13")" />
<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 , "1" , "4")" />
<xsl:variable name="var:v347" select="userCSharp:LogicalEq(string($var:v346) , "BF14")" />
<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段。
我尝试了很多方法但无法使其工作并需要一些帮助/建议。
非常感谢任何帮助。
感谢您并期待回复。
答案 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
条件。