使用 xslt 引用具有不同命名空间的元素

Posted

技术标签:

【中文标题】使用 xslt 引用具有不同命名空间的元素【英文标题】:Reference to an element with a different namespace with xslt 【发布时间】:2018-07-13 14:27:29 【问题描述】:

我正在使用输入模式中的一个特定值构建一个带有XSLT 的 XML 模式。我的目标是为其他文档构建一个通用的 xslt。

这是我的输入xsd 简化版:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:nr0="http://NamespaceTest.com/balisesXrm" xmlns:xalan="http://xml.apache.org/xslt" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" SCCOAMCD:desc="  implémentation du MCD pivot du SCCOA 3.2.1ec  production par SCCOA mcd2mpd 4.1.1, le 11/12/2007  règles spécifiques production schémas 1.2  diagramme : A-SC.SBE GestionZonesAeriennes SYSCA  entité racine      : A-SC.ZoneAerienne " attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:SBEGestionZonesAeriennesSYSCA-schema" version="3.2.1ec">

<xsd:element name="SBEGestionZonesAeriennesSYSCA" type="SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"/>

<xsd:schema>

我写了这个xslt

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
xmlns:err="http://www.w3.org/2005/xqt-errors"
exclude-result-prefixes="xsd xdt err fn"
xmlns:redirect="http://xml.apache.org/xalan/redirect"
extension-element-prefixes="redirect"
xmlns:xalan="http://xml.apache.org/xslt">

<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>

<xsl:template match="xsd:schema">
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema"
xmlns:xrm="http://www.moss.fr/2011/connecteur_xrm" xmlns:nr0="http://NamespaceTest.com/balisesXrm" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns:metier="urn:SBEGestionZonesAeriennesSYSCA-schema"  targetNamespace="http://www.moss.fr/2011/connecteur_xrm" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xsl:call-template name="importbalisesXrm"/>
        <xsl:call-template name="importNamespaceXrm"/>
        <xsl:apply-templates/>
        <xsl:call-template name="mapping"/>
    </xsd:schema>
</xsl:template>

<xsl:template name="mapping">
<xsd:complexType name="mapping">
        <xsd:sequence>
            <xsd:element ref="xsd:element/@name" namespace="urn:SBEGestionZonesAeriennesSYSCA-schema"/>
        </xsd:sequence>
        <xsd:attribute name="occurs"></xsd:attribute>
    </xsd:complexType>
</xsl:template>
</xsl:stylesheet>

我的问题在于这条指令,输出 XSD 给了我ref="SBEGestionZonesAeriennesSYSCA",而我想要ref="metier:SBEGestionZonesAeriennesSYSCA"。 希望有人有想法使用value-of 命令添加prefix

【问题讨论】:

【参考方案1】:

目前您正在执行此操作...

<xsd:element ref="xsd:element/@name" ... />

但属性值模板不需要占用整个属性值。你可以这样做...

<xsd:element ref="metier:xsd:element/@name" ... />

另一种方法是这样做,但这并不简洁

<xsd:element ref="concat('metier:', xsd:element/@name)" ... />

为了将来的参考,您可以使用任意数量的 AVT,因此这将是有效的,例如,虽然相当过度

 <xsl:variable name="prefix" select="'metier'" />
 <xsd:element ref="$prefix:xsd:element/@name" ... />

【讨论】:

谢谢,没想到这么简单...我应该删除我的帖子吗? 只有知道答案后才简单:)。但我认为在这种情况下,它可能真正有利于 XSLT 的其他新手,所以值得保留这个问题。 为了未来读者的利益,请务必保留您的问题和@TimC 的答案。

以上是关于使用 xslt 引用具有不同命名空间的元素的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 在与根元素具有相同命名空间声明的内部标记中缺少命名空间

XSLT 将命名空间前缀添加到元素最佳实践

使用命名空间时无法在 XSLT 中复制和修改属性

重命名元素的 XSLT 问题——更改命名空间

如何使用 XSLT 替换命名空间中的元素?

xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀