2011-12-14 2 views
1

Я новичок в XSLT Я пытаюсь преобразовать пару значений имени в соответствующий XML. Эта функция в основном используется в случае специальных расширений стандарта. Файл, который я хочу преобразовать, следующий.xslt преобразование xml в соответствующие пары значений значений

<ODEventNotificationExtraField> 
<callCode>1</callCode> 
<callbackType>All </callbackType> 
<callbackEmail>[email protected] </callbackEmail> 
</ODEventNotificationExtraField> 

к следующему:

<?xml version="1.0" encoding="UTF-8"?> 
<extensionList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="ExtensionItems.xsd"> 
<extensionsItem> 
<extName> callCode</extName> 
<extValue>1</extValue> 
<extType>integer</extType> 
</extensionsItem> 
<extensionsItem> 
<extName>callbackType</extName> 
<extValue>All</extValue> 
<extType>string</extType> 
</extensionsItem> 
<extensionsItem> 
<extName>callbackEmail</extName> 
<extValue>[email protected]</extValue> 
<extType>string</extType> 
</extensionsItem> 
</extensionsList> 

на основе имени поля, например CallCode Я знаю, что это имеет целочисленный тип (он должен быть жестко в XSLT) в XMLSCHEMA для поступающих данных определяется как

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
<xs:simpleType name="CallbackType"> 
<xs:restriction base="xs:string"> 
<xs:enumeration value="Restoration"/> 
<xs:enumeration value="Estimated"/> 
<xs:enumeration value="All"/> 
<xs:enumeration value="None"/> 
</xs:restriction> 
</xs:simpleType> 
<xs:element name="ODEventNotificationExtraField"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="callCode" type="xs:integer" minOccurs="0"/> 
<xs:element name="callbackType" type="CallbackType" minOccurs="0"/> 
<xs:element name="callbackEmail" type="xs:string" minOccurs="0"/> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:schema> 
+2

Пример вывода отсутствуют некоторые старт/закрывающие теги ... Е.Г. ''. Если вы сделаете это хорошо сформированным, нам не придется угадывать фактическую структуру. – LarsH

ответ

1

следующая таблица стилей производит желаемого результата:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <!-- element list --> 
    <xs:element name="callCode" type="xs:integer"/> 
    <xs:element name="callbackType" type="xs:string"/> 
    <xs:element name="callbackEmail" type="xs:string"/> 
    <xsl:template match="/"> 
     <extensionItems xs:noNamespaceSchemaLocation="ExtensionItems.xsd"> 
      <extensionsList> 
       <xsl:apply-templates select="/ODEventNotificationExtraField/*"/> 
      </extensionsList> 
     </extensionItems> 
    </xsl:template> 
    <xsl:template match="*"> 
     <extensionsItem> 
      <extName><xsl:value-of select="local-name()"/></extName> 
      <extValue><xsl:value-of select="."/></extValue> 
      <extType> 
       <xsl:value-of 
        select="substring-after(document('')/*/xs:element[ 
         @name=current()/local-name()]/@type, ':')"/> 
       </extType> 
     </extensionsItem> 
    </xsl:template> 
</xsl:stylesheet> 

Обратите внимание на жесткое кодирование типов элементов и использование document для их извлечения.

Выход:

<extensionItems xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
       xs:noNamespaceSchemaLocation="ExtensionItems.xsd"> 
    <extensionsList> 
     <extensionsItem> 
     <extName>callCode</extName> 
     <extValue>1</extValue> 
     <extType>integer</extType> 
     </extensionsItem> 
     <extensionsItem> 
     <extName>callbackType</extName> 
     <extValue>All</extValue> 
     <extType>string</extType> 
     </extensionsItem> 
     <extensionsItem> 
     <extName>callbackEmail</extName> 
     <extValue>[email protected]</extValue> 
     <extType>string</extType> 
     </extensionsItem> 
    </extensionsList> 
</extensionItems> 
+0

спасибо, что я искал, это отличная помощь – user1096618

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