我有一条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>^~\&</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>
答案 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>^~\&</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>^~\&</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>