XSLT для алфавитного XML - PullRequest
       7

XSLT для алфавитного XML

1 голос
/ 26 апреля 2010

У меня есть около 10 xml-схем, которые я должен очистить путем алфавитизации элементов / типов.Некоторое время я гуглил и нашел чье-то решение,

Здесь

, которое по какой-то причине мне не подходит (оно пропускается с xsd: schema до xsd:comlplexType name = Account).Вот упрощенный пример, поскольку вы можете видеть, что первые 10 или около того элементов расположены по порядку, но когда разработчик добавил 2 новых поля, они вышли из строя (crossRef и ID).Я хочу убедиться, что CrossRef и ID располагаются в алфавитном порядке не только в последовательности, определенной как часть объекта Account, но также, если они были определены как их собственные типы отдельно (эти два поля не являются, но остальные являются), чтоих определения также будут в алфавитном порядке с остальными определениями.

<?xml version="1.0" encoding="utf-8"?><xsd:schema targetNamespace="####" xmlns="####" xmlns:lms.base="####/base" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="###/base" schemaLocation="Base.xsd" />

<xsd:element name="Account" type="Account" />

<xsd:complexType name="Account" >

    <xsd:complexContent >
        <xsd:extension base="lms.base:ExtensionBase">
            <xsd:sequence >
                <xsd:element name="Address" type="lms.base:Address" minOccurs="0" maxOccurs ="unbounded" />       
                <xsd:element name="BusinessSegment" type="lms.base:BusinessSegment" minOccurs ="0" maxOccurs ="1" />
                <xsd:element name="Name" type="AccountName" minOccurs ="0" maxOccurs ="1" />
                <xsd:element name="Number" type="AccountNumber" minOccurs ="0" maxOccurs ="1" />
                <xsd:element name="Office" type="AccountOffice" minOccurs ="0" maxOccurs ="1" />
                <xsd:element name="Status" type="AccountStatus" minOccurs ="0" maxOccurs ="1" />
                <xsd:element name="UWMemo" type="lms.base:UWMemo" minOccurs ="0" maxOccurs ="1" />
      <xsd:element name="CrossRef" type="lms.base:string-minLength" minOccurs="0" maxOccurs="unbounded" />
            </xsd:sequence>
    <xsd:attribute name="ID" type="xsd:long" />
        </xsd:extension>
    </xsd:complexContent>       
</xsd:complexType>

<xsd:simpleType name="AccountID">
    <xsd:restriction base="lms.base:ID" />
</xsd:simpleType>

<xsd:simpleType name="AccountName">
    <xsd:restriction base="lms.base:string-minLength" />
</xsd:simpleType>

<xsd:simpleType name="AccountNumber">
    <xsd:restriction base="lms.base:string-minLength" />
</xsd:simpleType>

<xsd:simpleType name="AccountStatus">
    <xsd:restriction base="lms.base:string-minLength">
        <xsd:enumeration value="Not_Assigned" />
        <xsd:enumeration value="Active" />
        <xsd:enumeration value="Inactive" />
        <xsd:enumeration value="Targeted/Prospect" />
        <xsd:enumeration value="Lost" />
        <xsd:enumeration value="Submission Declined" />
        <xsd:enumeration value="Terminated" />
        <xsd:enumeration value="Claim" />
        <xsd:enumeration value="Watch List" />
        <xsd:enumeration value="H.O. Hold/Suspend" />
        <xsd:enumeration value="Infrequent" />
    </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="AccountOffice">
    <xsd:complexContent>
        <xsd:extension base="lms.base:Value"/>
    </xsd:complexContent>
</xsd:complexType>

1 Ответ

3 голосов
/ 27 апреля 2010

Вы хотите отсортировать все по атрибуту name, верно? В этом случае это может работать:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

    <!-- Sort child elements by name, if any child has one -->
    <xsl:template match="*[*/@name]">
        <xsl:copy>
            <xsl:copy-of select="@*|text()"/>
            <xsl:apply-templates select="*">
                <xsl:sort select="@name"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <!-- Identity template for everything else -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*">
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...