簡體   English   中英

如何將xsl嵌入xml文件

[英]how to embed xsl into xml file

我有一個文件test.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>

通過在test.xml添加以下行<?xml-stylesheet type="text/xsl" href="styles.xsl"?> ,可以使頁面正確顯示。 現在,我試圖將兩個文件合並為一個.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線程上執行以下步驟將返回空白頁面或未格式化的頁面

我有想念嗎?

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:

的test.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>

請注意,如果需要,此XSLT仍可以應用於其他XML文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM