我的输入XML如下所示:
<ORU>
<OBR>
<OBR_SetId>1</OBR_SetId>
</OBR>
<OBX></OBX>
<OBX></OBX>
<OBX></OBX>
<SPM></SPM>
<ORC></ORC>
<OBR>
<OBR_SetId>2</OBR_SetId>
</OBR>
<OBX></OBX>
<OBX></OBX>
<OBX></OBX>
<OBR>
<OBR_SetId>3</OBR_SetId>
</OBR>
<OBX></OBX>
<OBX></OBX>
<OBX></OBX>
</ORU>
意思是,<OBR>
是父母&amp;每个都有3个<OBX>
子记录。我必须遍历<OBR>
&amp;相应的<OBX>
来读取值。我正在使用下面的代码。但只有第一个<OBR>
有子节点,所有<OBX>
都不是3.怎么办?
<xsl:variable name="OBR" select="//*[local-name()='OBR_ObservationRequest' and namespace-uri()='']" />
<xsl:for-each select="$OBR">
<ns0:entity>
<xsl:variable name="OBR_SetId" select="position()" />
................
<xsl:variable name="obx" select="//OBX_ObservationResult[preceding-sibling::OBR_ObservationRequest[1][position() = $OBR_SetId]]" />
<xsl:if test="count($obx) > 0">
<xsl:for-each select="$obx">
.......................
答案 0 :(得分:0)
试试这个:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<root>
<xsl:apply-templates select="//OBR"/>
</root>
</xsl:template>
<xsl:template match="//OBR">
<xsl:variable name="header" select="."/>
<OBR>
<xsl:attribute name="OBR_SetId">
<xsl:value-of select="./OBR_SetId"/>
</xsl:attribute>
<children>
<xsl:for-each select="following-sibling::OBX[preceding-sibling::OBR[1] = $header]">
<OBX>
<xsl:value-of select="."/>
</OBX>
</xsl:for-each>
</children>
</OBR>
</xsl:template>
</xsl:stylesheet>
使用以下输入时:
<ORU>
<OBR>
<OBR_SetId>1</OBR_SetId>
</OBR>
<OBX>1</OBX>
<OBX>2</OBX>
<OBX>3</OBX>
<SPM/>
<ORC/>
<OBR>
<OBR_SetId>2</OBR_SetId>
</OBR>
<OBX>4</OBX>
<OBX>5</OBX>
<OBX>6</OBX>
<OBR>
<OBR_SetId>3</OBR_SetId>
</OBR>
<OBX>7</OBX>
<OBX>8</OBX>
<OBX>9</OBX>
</ORU>
我得到以下输出:
<?xml version="1.0" encoding="utf-8"?>
<root>
<OBR OBR_SetId="1">
<children>
<OBX>1</OBX>
<OBX>2</OBX>
<OBX>3</OBX>
</children>
</OBR>
<OBR OBR_SetId="2">
<children>
<OBX>4</OBX>
<OBX>5</OBX>
<OBX>6</OBX>
</children>
</OBR>
<OBR OBR_SetId="3">
<children>
<OBX>7</OBX>
<OBX>8</OBX>
<OBX>9</OBX>
</children>
</OBR>
</root>
仅供参考:这是基于提供的解决方案here