2016-02-12 2 views
0

Я создаю простой XML-документ, например.Ввод элементов xml по заданному xsd с помощью xslt

<Address> 
    <Recipient> 
    abc 
    </Recipient> 
    <Street> 
    123 
    </Street> 
</Address> 

Для этого xml существует xsd, например.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Address"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Street"/> 
     <xs:element name="Recipient"/> 
    </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 

, поскольку вы можете видеть, что порядок Улица и Получателя неправильный. Как изменить порядок xml по отношению к xsd или определить порядок во время процесса создания xml?

+2

Как этот вопрос связан с [этим предыдущим вашим вопросом] (http://stackoverflow.com/q/35330636/1987598)? Что такое ваш «процесс строительства»? Проверка XML не преобразует документы, она только скажет вам, является ли документ действительным или нет, и ничего не сделает за пределами этого. Если вы хотите попросить таблицу стилей XSLT, которая делает это: насколько обширны правила переупорядочения? Известны ли они или может ли таблица стилей XSLT вывести правила из XSD? –

+0

Я создаю XML из набора строк, где каждая строка выглядит как путь. На пути я создаю элемент и добавляю его в свой документ. Но порядок моих элементов определен в xsd, и я ищу умный способ передать мой процесс строительства этой информацией независимо от того, использую ли я C# или xslt. – StellaMaris

+3

Вы можете посмотреть http://stackoverflow.com/questions/35119292/how-to-transform-unordered-elements-in-xml-to-match-an-xsdsequence-order/, который имеет ответ, но также имеет ответ от Майкла Кей (мнение которого стоит послушать) о том, почему этот подход ошибочен. –

ответ

0

Вы можете сделать это следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/> 
    <xsl:variable name="schema"> 
     <xsl:copy-of select="doc('test.xsd')"/> 
    </xsl:variable> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Address"> 
     <xsl:copy> 
      <xsl:variable name="Address" select="."/> 
      <xsl:for-each select="$schema//xs:element[@name='Address']/xs:complexType/xs:sequence/xs:element/@name"> 
       <xsl:apply-templates select="$Address/*[local-name()=current()]"/> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Обратите внимание, что это решение ограничено только этой довольно простой случай.

Смежные вопросы