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>
注意,如果需要
感謝這個XSLT仍然可以應用到其他的XML文件!將xml嵌入到xsl中而不是其他方式通常是常見做法? – ljk
說實話,這可能是通常的做法。理想情況下,您將XSLT分開,以便它可以輕鬆地重新應用於任何XML,而不是綁定到特定的XML。可以說,你自己也可以應用這個轉換,而只是提供轉換的結果。 –