2013-05-13 17 views
1

輸入XML如何使用xslt2.0加載&gt到另一個xml?

<note> 
<from>Example</from> 
<heading>Reminder</heading> 
<body>XSLT conversion</body> 
</note> 

輸出XML的預期。

<xml> 
    <data> 
    <column1> 
     &lt;note&gt; 
     &lt;from&gt;Example&lt;/from&gt; 
     &lt;heading&gt;Reminder&lt;/heading&gt; 
     &lt;body&gt;XSLT conversion&lt;/body&gt; 
     &lt;/note&gt; 
    </column1> 
    </data> 
</xml> 

當前XSLT我們使用,我們有一些問題,加載輸入。 (如果輸入是直接的XML,我們沒有任何問題複製它,它只有編碼的XML)。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template match="/"> 
    <xml> 
     <data> 
     <column1> 
      <xsl:copy> 
      <xsl:copy-of select="/node()"/> 
      </xsl:copy> 
     </column1> 
     </data> 
    </xml> 
    </xsl:template> 

</xsl:stylesheet> 

回答

1

「輸入XML」不是XML在所有 - 它只是一段文字。

一個有效的XML文檔必須有一個單根元素,並且除非文件中顯示的文本內容中沒有內容,否則根本沒有元素。

如果你換你的XML中的虛擬根元素,這樣

<root> 
&lt;note&gt; 
&lt;from&gt;Example&lt;/from&gt; 
&lt;heading&gt;Reminder&lt;/heading&gt; 
&lt;body&gt;XSLT conversion&lt;/body&gt; 
&lt;/note&gt; 
</root> 

那麼你可以使用這個樣式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
    <xml> 
     <data> 
     <column1> 
      <xsl:value-of select="root"/> 
     </column1> 
     </data> 
    </xml> 
    </xsl:template> 

</xsl:stylesheet> 

得到這個輸出

<?xml version="1.0" encoding="UTF-8"?> 
<xml> 
    <data> 
     <column1> 
&lt;note&gt; 
&lt;from&gt;Example&lt;/from&gt; 
&lt;heading&gt;Reminder&lt;/heading&gt; 
&lt;body&gt;XSLT conversion&lt;/body&gt; 
&lt;/note&gt; 
</column1> 
    </data> 
</xml> 
+0

謝謝,它根本沒有xml標記,所有這些('<','>')轉換爲&gt,&lt;但是這個XSLT代碼適用於普通的xml,而不是&gt;&lt; xml .. output.any幫助? – 2013-05-13 20:28:58

+0

@ChristopherDavid:就目前而言,您的數據不是XML,因此無法使用XSLT進行處理。如果你所要做的只是把它包裝在'xml/data/column1'中,那麼就寫一個打印出來的程序。 – Borodin 2013-05-13 20:58:39

3

改造它由於您使用的是XSLT 2.0,因此您可以使用unparsed-text()來處理您的輸入。如果將路徑作爲參數傳遞給文本文件,則可以使用具有相同樣式表的文本或XML輸入。

  • 如果輸入是文本,請將路徑作爲參數傳遞給文本文件。你仍然需要將XML傳遞給樣式表,所以你可以使用樣式表本身作爲輸入。
  • 如果輸入是XML,請不要將值傳遞給參數。

輸入(test.txt的)

&lt;note&gt; 
&lt;from&gt;Example&lt;/from&gt; 
&lt;heading&gt;Reminder&lt;/heading&gt; 
&lt;body&gt;XSLT conversion&lt;/body&gt; 
&lt;/note&gt; 

XSLT 2.0(使用樣式表作爲XML輸入並傳遞test.txt作爲input PARAM)

<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xs"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="input" select="''" as="xs:string"/> 

    <xsl:template match="/"> 
     <xml> 
      <data> 
       <column1> 
        <xsl:choose> 
         <xsl:when test="$input"> 
          <xsl:copy-of select="unparsed-text($input)"/>       
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:copy-of select="*"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </column1> 
      </data> 
     </xml> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<xml> 
    <data> 
     <column1>&amp;lt;note&amp;gt; 
&amp;lt;from&amp;gt;Example&amp;lt;/from&amp;gt; 
&amp;lt;heading&amp;gt;Reminder&amp;lt;/heading&amp;gt; 
&amp;lt;body&amp;gt;XSLT conversion&amp;lt;/body&amp;gt; 
&amp;lt;/note&amp;gt; 
</column1> 
    </data> 
</xml> 
+0

+1得到正確的答案。 – 2013-05-14 02:31:38

相關問題