我是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相同的序列,而不是为每个元素一次性提取所有值?
答案 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>