[英]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.