用于兄弟节点的XSLT映射

时间:2014-10-22 20:20:52

标签: xml xslt biztalk hl7

我的输入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) &gt; 0">
<xsl:for-each select="$obx">
        .......................

1 个答案:

答案 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