将XML从旧模式转换为新模式?
我需要将不使用任何模式的XML文档转换为使用定义良好的模式的另一种格式。将XML从旧模式转换为新模式?
所以基本上我要改造这个:
<healthCareFacilityTypeCode
displayName="Home"
codingScheme="Connect-a-thon healthcareFacilityTypeCodes"
>Home</healthCareFacilityTypeCode>
进入这个:
<healthCareFacilityTypeCode>
<code>Home</code>
<displayName>
<LocalizedString value="Home" />
</displayName>
<schemeName>Connect-a-thon healthcareFacilityTypeCodes</schemeName>
</healthCareFacilityTypeCode>
我知道如何用手工通过查看架构改造它。下面是XSD的一个片段:
<xsd:complexType name="DocumentEntryType">
<xsd:sequence>
<xsd:element minOccurs="0"
name="healthCareFacilityTypeCode"
type="tns:CodedMetadataType"/>
</xsd:sequence>
<xsd:attribute default="false"
name="existing"
type="xsd:boolean"
use="optional"/>
</xsd:complexType>
<xsd:element name="DocumentEntry" type="tns:DocumentEntryType"/>
什么我不知道如何解决的是:如何利用目标XSD从源XML转换节点到目标XML文档。我觉得所有执行转换的信息都位于XSD中,但我可以使用它吗?怎么样?
任何帮助将不胜感激!
接下来的建议,这就是我想出的。不完美,但对我的目的来说就足够了。
<xsl:template match="XDSDocumentEntry">
<DocumentEntryType>
<xsl:call-template name="namespaceChange"/>
<xsl:apply-templates/>
</DocumentEntryType>
</xsl:template>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[matches(name(), 'Code')]">
<xsl:copy>
<code>
<xsl:value-of select="."/>
</code>
<schemeName>
<xsl:value-of select="@codingScheme"/>
</schemeName>
<displayName>
<LocalizedString>
<xsl:attribute name="value">
<xsl:value-of select="@displayName"/>
</xsl:attribute>
</LocalizedString>
</displayName>
</xsl:copy>
</xsl:template>
您不能使用xsl:attribute生成名称空间声明 - 命名空间和属性在XSLT数据模型中不是同一个东西。一致的XSLT处理器会抛出这个问题。在XSLT 2.0中,使用xsl:namespace。 – 2011-04-20 21:07:20
谢谢。我做了改变。 – 2011-04-20 23:44:33
但是这并不回答你的问题,因为你没有要求XSLT样式表... – 2011-04-21 02:12:24
目标XSD将帮助您验证转换的结果,但不会直接帮助生成转换。然而,像开发样式表*一样,一个好的XSLT IDE,如Oxygen和可能的StylusStudio,将帮助您在很大程度上验证输出元素。考虑到结果文档的模式,架构感知型XSLT 2.0处理器还可以在运行时验证其输出。 – LarsH 2011-04-19 20:10:08
@LarsH XSLT IDE可以更进一步,使用XSD为XSLT允许的literal-result-elements/attributes提供自动完成。与此相关的主要问题是,除非所有元素和属性都在XSD的顶层(全局)中声明,否则如果上下文不足,可能会出现模糊。另外,这在使用xsl:element和xsl:attribute指令而不是文字结果等价物时没有帮助,但我认为它比没有好。 – pgfearo 2011-04-20 03:35:42
@pgfearo - 我认为IDE会提供辅助完成功能,但我没有太多使用XSD,所以我不确定。正如你所说,它仍然不是一个完整的解决方案,但可能会有所帮助。 – LarsH 2011-04-20 16:47:04