XPath命令不返回任何内容-XML模式

时间:2018-07-09 08:02:44

标签: xml xslt xpath

我正在编写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&apos;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&apos;é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&apos;é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&apos;état d&apos;une zone ou d&apos;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&apos;état de disponibilité d&apos;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&apos;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没有选择任何内容。

1 个答案:

答案 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>