我正在编写XSLT代码,将XML模式转换为另一个模式。 我想使用输入模式中的属性值。
这是我要更改的XML模式:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema SCCOAMCD:desc="" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:SBEGestionZonesAeriennesSYSCA-schema" version="3.2.1ec" xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="typeAssociation">
<xsd:sequence>
<xsd:element name="refid" type="xsd:QName"/>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="typeString">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="typeBoolean">
<xsd:restriction base="xsd:boolean"/>
</xsd:simpleType>
<xsd:simpleType name="typeShort">
<xsd:restriction base="xsd:short"/>
</xsd:simpleType>
<xsd:simpleType name="typeInteger">
<xsd:restriction base="xsd:long"/>
</xsd:simpleType>
<xsd:simpleType name="typeReal">
<xsd:restriction base="xsd:float"/>
</xsd:simpleType>
<xsd:simpleType name="typeDouble">
<xsd:restriction base="xsd:double"/>
</xsd:simpleType>
<xsd:simpleType name="typeDecimal">
<xsd:restriction base="xsd:decimal"/>
</xsd:simpleType>
<xsd:simpleType name="typeAnnee">
<xsd:restriction base="xsd:gYear"/>
</xsd:simpleType>
<xsd:simpleType name="typeAnneeMois">
<xsd:restriction base="xsd:gYearMonth"/>
</xsd:simpleType>
<xsd:simpleType name="typeDate">
<xsd:restriction base="xsd:date"/>
</xsd:simpleType>
<xsd:simpleType name="typeHeure">
<xsd:restriction base="xsd:time"/>
</xsd:simpleType>
<xsd:simpleType name="typeDTG">
<xsd:restriction base="xsd:dateTime"/>
</xsd:simpleType>
<xsd:simpleType name="typeAnyURI">
<xsd:restriction base="xsd:anyURI"/>
</xsd:simpleType>
<xsd:simpleType name="typeDatatypeChaine1a2000">
<xsd:restriction base="typeString">
<xsd:minLength value="1"/>
<xsd:maxLength value="2000"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="typeDatatypeChaine1a30">
<xsd:restriction base="typeString">
<xsd:minLength value="1"/>
<xsd:maxLength value="30"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType SCCOAMCD:desc="Une caractéristique intangible d'intérêt militaire qui est spécifiée administrativement, peut être représentée par une figure géométrique, et est associée à la conduite des opérations militaires" SCCOAMCD:entite="A-SC.ElementControle" name="ElementControle">
<xsd:sequence>
<xsd:element SCCOAMCD:desc="a_pour_etat" SCCOAMCD:relation="A-SC.ElementControle,EtatEltControle" maxOccurs="1" minOccurs="1" name="a_pour_etat" type="SBEGestionZonesAeriennesSYSCA:EtatEltControle"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType SCCOAMCD:desc="Etat" SCCOAMCD:entite="A-SC.Etat" name="Etat">
<xsd:sequence>
<xsd:element SCCOAMCD:attribut="A-SC.Etat.Commentaires" SCCOAMCD:desc="Commentaires sur l'état" maxOccurs="1" minOccurs="0" name="commentaires" type="SBEGestionZonesAeriennesSYSCA:typeDatatypeChaine1a2000"/>
<xsd:element SCCOAMCD:attribut="A-SC.Etat.GdhDebut" SCCOAMCD:desc="Date début de validité de l'état" maxOccurs="1" minOccurs="1" name="gdhDebut" type="typeDTG"/>
<xsd:element SCCOAMCD:attribut="A-SC.Etat.GdhFin" SCCOAMCD:desc="GDH estimé du retour opérationnel ou date prochain état" maxOccurs="1" minOccurs="0" name="gdhFin" type="typeDTG"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType SCCOAMCD:desc="Description de l'état d'une zone ou d'une sous zone" SCCOAMCD:entite="A-SC.EtatEltControle" name="EtatEltControle">
<xsd:complexContent>
<xsd:extension SCCOAMCD:entite="A-SC.Etat" base="SBEGestionZonesAeriennesSYSCA:Etat">
<xsd:sequence>
<xsd:element SCCOAMCD:attribut="A-SC.EtatEltControle.Etat" SCCOAMCD:desc="Dictionnaire précisant l'état de disponibilité d'un élément de contrôle" maxOccurs="1" minOccurs="1" name="etat" type="typeString"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType SCCOAMCD:desc="Portion de l'espace aérien pour lequel peuvent-être définis :" SCCOAMCD:entite="A-SC.ZoneAerienne" name="ZoneAerienne">
<xsd:complexContent>
<xsd:extension SCCOAMCD:entite="A-SC.ElementControle" base="SBEGestionZonesAeriennesSYSCA:ElementControle">
<xsd:sequence>
<xsd:element SCCOAMCD:attribut="A-SC.ZoneAerienne.Code" SCCOAMCD:desc="Code identifiant la zone Aérienne de manière unique hors ACO et ATO" maxOccurs="1" minOccurs="1" name="code" type="SBEGestionZonesAeriennesSYSCA:typeDatatypeChaine1a30"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="SBEGestionZonesAeriennesSYSCA" type="SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"/>
<xsd:complexType name="type_SBEGestionZonesAeriennesSYSCA">
<xsd:sequence>
<xsd:element minOccurs="0" name="Header" type="SBEGestionZonesAeriennesSYSCA:type_SCCOA_header"/>
<xsd:element name="Entities" type="SBEGestionZonesAeriennesSYSCA:type_Data_SBEGestionZonesAeriennesSYSCA"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="type_SCCOA_header">
<xsd:sequence>
<xsd:element fixed="1.0" name="VersionSchemaSCCOA" type="xsd:string"/>
<xsd:element minOccurs="0" name="Nom" type="xsd:string"/>
<xsd:element minOccurs="0" name="Commentaire" type="xsd:string"/>
<xsd:element minOccurs="0" name="Classification" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="type_Data_SBEGestionZonesAeriennesSYSCA">
<xsd:choice maxOccurs="unbounded" minOccurs="1">
<xsd:element name="ZoneAerienne" type="SBEGestionZonesAeriennesSYSCA:ZoneAerienne"/>
</xsd:choice>
</xsd:complexType>
</xsd:schema>
在最后一个模式中,我想选择名称的值和最后一个标记的类型。
> "SBEGestionZonesAeriennesSYSCA"
> "SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"
我尝试了以下XSLT的代码,但未成功:
<?xml version="1.0" encoding="UTF-8" ?>
<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">
<!-- Pour avoir bonne indentation en sortie -->
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<!-- Transformation identité -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Création de nos nouveaux noeuds -->
<xsl:template match="xsd:schema">
<!-- on crée à nouveau le schema-->
<xsd:schema xmlns:nr0="http://NamespaceTest.com/balisesXrm" >
<xsl:copy-of select="namespace::*"/>
<!-- on copie ce qu'il y avait déjà dans le schéma -->
<xsl:copy-of select="@*"/>
<!-- on remet tous les éléments enfants du schéma -->
<xsl:apply-templates/>
<!-- on crée notre propre branche pour appeler notre complexType-->
<xsl:call-template name="mapping"/>
<xsl:call-template name="baliseRacine"/>
</xsd:schema>
</xsl:template>
<xsl:template name="mapping">
<xsl:element name="xsd:complexType">
<xsl:attribute name="name">mapping</xsl:attribute>
<xsl:element name="xsd:sequence">
<xsl:element name="xsd:element">
<xsl:attribute name="name">
<xsl:value-of select="xsd:schema/xsd:element/@name"/>
</xsl:attribute>
<xsl:attribute name="occurs">
<xsl:value-of select="xsd:schema/xsd:element/@type"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template name="baliseRacine">
<xsl:element name="xsd:element">
<xsl:attribute name="name">plugin</xsl:attribute>
<xsl:element name="xsd:complexType">
<xsl:element name="xsd:sequence">
<xsl:element name="xsd:element">
<xsl:attribute name="name">mapping</xsl:attribute>
<xsl:attribute name="type">mapping</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是我的XML模式由此所转换的:
<xsd:complexType name="mapping">
<xsd:sequence>
<xsd:element name="" occurs=""/>
</xsd:sequence>
</xsd:complexType>
我找不到为什么XPath没有选择任何内容。
答案 0 :(得分:1)
如果xsd:schema
元素是上下文节点,并且您想要选择子级xsd:element
,则需要调整路径以
<xsl:template name="mapping">
<xsl:element name="xsd:complexType">
<xsl:attribute name="name">mapping</xsl:attribute>
<xsl:element name="xsd:sequence">
<xsl:element name="xsd:element">
<xsl:attribute name="name">
<xsl:value-of select="xsd:element/@name"/>
</xsl:attribute>
<xsl:attribute name="occurs">
<xsl:value-of select="xsd:element/@type"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
或者更好地使用文字结果元素和属性值模板
<xsl:template name="mapping">
<xsd:complexType name="mapping">
<xsd:sequence>
<xsd:element name="{xsd:element/@name}" occurs="{xsd:element/@type}"/>
</xsd:sequence>
</xsd:complexType>