Xslt将整个XML消息复制到节点中

时间:2015-11-12 20:57:54

标签: xml xslt

我有一条XML消息,我想从中提取一些元数据,但我也想在消息中添加另一个名为“MessageXml”的节点或类似的东西。

到目前为止,我已经部分使用了它:

<xsl:template match="ns0:*">
    <xsl:element name="MessageXml">
        <xsl:copy-of select="."/>
    </xsl:element>
</xsl:template>

问题是,这不会将名称空间复制到select="."结果的根节点。我需要命名空间。

然后我尝试了:

<xsl:template match="MyOriginalMessageRootNode">
    <MessageXml>
        <xsl:copy-of select="@*" />
    </MessageXml>
</xsl:template>

但是那只是在我假设的某种递归无限循环中锁定XmlSpy。我觉得我很亲密,但我不能让它按照我想要的方式工作。

如何在将整个消息复制到节点时保留命名空间?

原始邮件如下:

<ns0:ADT_ALL_25_GLO_DEF xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X">
    <MSH>
       <MSH.2_EncodingCharacters>^~\&amp;</MSH.2_EncodingCharacters>
       <MSH.3_SendingApplication>
          <HD.0_NamespaceId>REG</HD.0_NamespaceId>
       </MSH.3_SendingApplication>
...SNIP...
</<ns0:ADT_ALL_25_GLO_DEF>

我希望得到结果:

 <root>
   <metadata>
     <somedata>
     </somedata>
   </metadata>
   <MessageXml>
      ...the message...
   </MessageXml>
</root>

1 个答案:

答案 0 :(得分:1)

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X"
exclude-result-prefixes="ns0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/ns0:ADT_ALL_25_GLO_DEF">
    <root>
        <metadata>
            <somedata>
            </somedata>
        </metadata>
        <MessageXml>
            <xsl:copy-of select="/"/>
        </MessageXml>
    </root>
</xsl:template>

</xsl:stylesheet>

应用于这个格式良好的(!)输入示例:

<强> XML

<ns0:ADT_ALL_25_GLO_DEF xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X">
    <MSH>
       <MSH.2_EncodingCharacters>^~\&amp;</MSH.2_EncodingCharacters>
       <MSH.3_SendingApplication>
          <HD.0_NamespaceId>REG</HD.0_NamespaceId>
       </MSH.3_SendingApplication>
    </MSH>
</ns0:ADT_ALL_25_GLO_DEF>

将返回:

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <metadata>
      <somedata/>
   </metadata>
   <MessageXml>
      <ns0:ADT_ALL_25_GLO_DEF xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X">
         <MSH>
            <MSH.2_EncodingCharacters>^~\&amp;</MSH.2_EncodingCharacters>
            <MSH.3_SendingApplication>
               <HD.0_NamespaceId>REG</HD.0_NamespaceId>
            </MSH.3_SendingApplication>
         </MSH>
      </ns0:ADT_ALL_25_GLO_DEF>
   </MessageXml>
</root>