无法获取重复项,无法让XSL处理没有属性的多个元素

时间:2014-05-14 16:28:15

标签: xml xslt

我是XSLT的新手。我必须为EHR做一个样式表。以下是XML的简化版本:

<Message>
    <MSH>
        <Id>1</Id>
    </MSH>
    <PID>
        <Id>2</Id>
    </PID>
    <ORC>
        <Id>3</Id>
        <PlacerOrderId>ORD723222-4</PlacerOrderId>
    </ORC>
    <OBR>
        <Id>4</Id>
        <OBRSetid>1</OBRSetid>
    </OBR>
    <OBX>
        <Id>5</Id>
        <OBXSetId>1</OBXSetId>
    </OBX>
    <OBX>
        <Id>6</Id>
        <OBXSetId>2</OBXSetId>
    </OBX>
    <OBX>
        <Id>7</Id>
        <OBXSetId>3</OBXSetId>
    </OBX>
    <SPM>
        <Id>8</Id>
        <SPBSetId>1</SPBSetId>
    </SPM>
    <ORC>
        <Id>9</Id>
        <PlacerOrderId/>
    </ORC>
    <OBR>
        <Id>10</Id>
        <OBRSetid>2</OBRSetid>
    </OBR>
    <OBX>
        <Id>11</Id>
        <OBXSetId>1</OBXSetId>
    </OBX>
    <OBX>
        <Id>12</Id>
        <OBXSetId>2</OBXSetId>
    </OBX>
    <OBX>
        <Id>13</Id>
        <OBXSetId>3</OBXSetId>
    </OBX>
    <ORC>
        <Id>14</Id>
        <PlacerOrderId/>
    </ORC>
    <OBR>
        <Id>15</Id>
        <OBRSetid>3</OBRSetid>
    </OBR>
    <OBX>
        <Id>16</Id>
        <OBXSetId>1</OBXSetId>
    </OBX>
    <OBX>
        <Id>17</Id>
        <OBXSetId>2</OBXSetId>
    </OBX>
    <OBX>
        <Id>18</Id>
        <OBXSetId>3</OBXSetId>
    </OBX>
    <ORC>
        <Id>19</Id>
        <PlacerOrderId/>
    </ORC>
    <OBR>
        <Id>20</Id>
        <OBRSetid>4</OBRSetid>
    </OBR>
    <OBX>
        <Id>21</Id>
        <OBXSetId>1</OBXSetId>
    </OBX>
    <OBX>
        <Id>22</Id>
        <OBXSetId>2</OBXSetId>
    </OBX>
    <OBX>
        <Id>23</Id>
        <OBXSetId>3</OBXSetId>
    </OBX>
</Message>

我创建了以下xslt只是为了让ORC和OBR首先工作:

<xsl:for-each select="ORC">
    <xsl:value-of select="Id"/>
    <xsl:value-of select="PlacerOrderId"/>
</xsl:for-each>
<xsl:for-each select="OBR">
    <xsl:value-of select="Id"/>
    <xsl:value-of select="OBRSetid"/>
</xsl:for-each>

它们出现了所有ORC值,后跟所有OBR值。我希望它执行第一个ORC值,然后是第一个OBR值,然后是OBX值集,等等与xml相同的序列。我试图将OBR for-each嵌套在ORC中,但这并不起作用,因为所有OBR值都是在第一组ORC值之后出现的。

如何将其编码为与xml相同的序列,而不是为每个元素一次性提取所有值?

2 个答案:

答案 0 :(得分:0)

你想要的东西可能是那样的

<xsl:template match="/">
        <xsl:apply-templates select="/Message/node()"/>
</xsl:template>

<xsl:template match="ORC">
    <xsl:value-of select="Id"/>
    <xsl:value-of select="PlacerOrderId"/>
</xsl:template>

<xsl:template match="OBR">
    <xsl:value-of select="Id"/>
    <xsl:value-of select="OBRSetid"/>
</xsl:template>

<xsl:template match="node()">
</xsl:template>

然后您可以添加新模板以匹配OBX,依此类推。

希望得到这个帮助 问候,

答案 1 :(得分:0)

也许你想要这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="/Message/*[self::ORC or self::OBR or self::OBX]"/>
    </xsl:template>

    <xsl:template match="ORC">
        <xsl:copy>
            <xsl:value-of select="Id"/><xsl:text> </xsl:text>
            <xsl:value-of select="PlacerOrderId"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="OBR">
        <xsl:copy>
            <xsl:value-of select="Id"/><xsl:text> </xsl:text>
            <xsl:value-of select="OBRSetid"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="OBX">
        <xsl:copy>
            <xsl:value-of select="Id"/><xsl:text> </xsl:text>
            <xsl:value-of select="OBXSetid"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

根据您的输入,它会产生:

<ORC>3 ORD723222-4</ORC>
<OBR>4 1</OBR>
<OBX>5 </OBX>
<OBX>6 </OBX>
<OBX>7 </OBX>
<ORC>9 </ORC>
<OBR>10 2</OBR>
<OBX>11 </OBX>
<OBX>12 </OBX>
<OBX>13 </OBX>
<ORC>14 </ORC>
<OBR>15 3</OBR>
<OBX>16 </OBX>
<OBX>17 </OBX>
<OBX>18 </OBX>
<ORC>19 </ORC>
<OBR>20 4</OBR>
<OBX>21 </OBX>
<OBX>22 </OBX>
<OBX>23 </OBX>