2015-09-11 62 views
1

我有一個文件test.xml如何嵌入XSL轉換成XML文件

<?xml veresion="1.0 encoding="UTF-8"> 

<foo name="1" b="2"> 
    <bar name="11" b="22"> 
    <baz name="111" b="222"/> 
    <baz name="112" b="223"/> 
    ... 
    </bar> 
</foo> 

和XSLT文件styles.xsl

<?xml version="1.0" encoding="utf-8"> 
<xsl:stylesheet version=1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
     <!--xslt--> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

我可以讓頁面中添加這一行,<?xml-stylesheet type="text/xsl" href="styles.xsl"?>正確顯示,在test.xml。現在我試圖將兩個文件合併成一個.xml文件,以便更方便地打開。我試圖合併兩個XML文檔的內容,但沒有奏效:

newtest.xml

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

    </html> 
</xsl:template> 
</xsl:stylesheet> 

繼其他SO線程步驟返回空白或格式化頁面

我錯過了什麼?

回答

2

XSLT文檔也是格式良好的XML文檔。 XSLT用於轉換XML文檔,因此您理論上可以將XSLT應用於其自身。

假設您目前的XSLT看起來像這樣

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl"> 
    <xsl:output method="html" omit-xml-declaration="yes"/> 

    <xsl:template match="foo"> 
     <h1><xsl:value-of select="@name" /></h1> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="bar"> 
     <h2><xsl:value-of select="@name" /></h2> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="baz"> 
     <p><xsl:value-of select="@name" /></p> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <xsl:apply-templates select="//foo" /> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

而不是嵌入XSLT到您的test.xml,你可以代替你的嵌入到XML的XSLT,但隨後將其保存爲XML文件。要做到這一點的方法之一是創建一個虛擬命名空間,你的XML作爲XSLT元素

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="my" 
    exclude-result-prefixes="xsl my"> 
<my:embeddedXML> 
    <foo name="1" b="2"> 
     <bar name="11" b="22"> 
     <baz name="111" b="222"/> 
     <baz name="112" b="223"/> 
     </bar> 
    </foo> 
</my:embeddedXML> 

然後,而不是做<xsl:apply-templates select="//foo" />的,與此

<xsl:apply-templates /> 

更換,但你還需要一個模板忽略「輸入」的XML元素xsl:

<xsl:template match="xsl:stylesheet"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="xsl:*" /> 

然後,只需這行添加到它的頂部,並保存該文件作爲Test.xml

<?xml-stylesheet type="text/xsl" href="Test.xml"?> 

因此,有效的是XML引用自己來獲取XSLT。

試試這個XML/XSLT:

測試。XML

<?xml-stylesheet type="text/xsl" href="Test.xml"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl my" xmlns:my="my"> 
    <xsl:output method="html" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*" /> 

    <my:embeddedXML> 
     <foo name="1" b="2"> 
      <bar name="11" b="22"> 
      <baz name="111" b="222"/> 
      <baz name="112" b="223"/> 
      </bar> 
     </foo> 
    </my:embeddedXML> 

    <xsl:template match="foo"> 
     <h1><xsl:value-of select="@name" /></h1> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="bar"> 
     <h2><xsl:value-of select="@name" /></h2> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="baz"> 
     <p><xsl:value-of select="@name" /></p> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <xsl:apply-templates /> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="xsl:stylesheet"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="xsl:*" /> 
</xsl:stylesheet> 

注意,如果需要

+0

感謝這個XSLT仍然可以應用到其他的XML文件!將xml嵌入到xsl中而不是其他方式通常是常見做法? – ljk

+0

說實話,這可能是通常的做法。理想情況下,您將XSLT分開,以便它可以輕鬆地重新應用於任何XML,而不是綁定到特定的XML。可以說,你自己也可以應用這個轉換,而只是提供轉換的結果。 –