2011-12-14 56 views
1

我是XSLT的新手我試圖將名稱值對轉換爲其對應的XML。此功能主要用於對標準進行特殊擴展的情況。我想要轉換的文件如下。xslt將xml轉換爲相應的名稱值對

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

以下內容:基於字段名稱例如CallCode我會知道它是類型爲整數

<?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> 

(它需要在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 2011-12-14 17:08:49

回答

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 2011-12-14 17:56:31