使用开始和结束标记包含相同XML标记的组

时间:2012-10-31 18:07:24

标签: xml insert tags

如何在XML文档中的一组相同xml标记周围插入结束标记和结束标记?例如,如果我的原始XML看起来如下:

<recordImport OperatorID="ABC123">
     <patients>
        <patient roomNo=1 name="George Washington" addressID="1">
            <address ID="1" street="123 Credibility Street" city="Boston" state="MA"/>
            <address ID="1" street="456 Aqualung Avenue" city="Seattle" state="WA"/>
        </patient>
        <patient roomNo=2 name="Thomas Jefferson" addressID="2">
            <address ID="2" street="5 Famous Street" city="Burbank" state="CA"/>
        </patient>
     </patients>
 </recordImport>

如何插入“地址”标签,如下所示:

<recordImport OperatorID="ABC123">
    <patients>
        <patient roomNo=1 name="George Washington" addressID="1">
           <addresses>
              <address ID="1" street="123 Credibility Street" city="Boston" state="MA"/>
              <address ID="1" street="456 Aqualung Avenue" city="Seattle" state="WA"/>
           </addresses>
        </patient>
        <patient roomNo=2 name="Thomas Jefferson" addressID="2">
            <addresses>
              <address ID="2" street="5 Famous Street" city="Burbank" state="CA"/>
            </addresses>              
        </patient>
    </patients>
</recordImport>

我更喜欢非LINQ解决方案,但如果归结为它,我会使用它。

提前致谢。

1 个答案:

答案 0 :(得分:0)

在这个特定示例中,您只需要将<addresses>元素作为每个<patient>的子元素包含在内,这对于使用XSLT来说是微不足道的。据推测,一般情况更为复杂。

使用XSLT 2.0,一般解决方案是:

<xsl:template match="*[address]">
  <xsl:for-each-group select="*" group-adjacent="node-name()">
    <xsl:choose>
      <xsl:when test="self::address">
         <addresses><xsl:copy-of select="current-group()"/></addresses>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="current-group()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
</xsl:template>

与身份模板相结合,以复制其他内容。