如何将xsl嵌入到xml文件中

时间:2015-09-11 23:47:16

标签: xml xslt

我有一个文件<?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>

styles.xsl

和xslt文件 <?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中添加此行newtest.xml来正确显示页面。现在我正在尝试将两个文件合并为一个.xml文件,以便更方便地打开。我尝试合并两个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>

'2015-08-01 08:15:00'

在其他SO线程上执行以下步骤将返回空白或未格式化的页面

我错过了什么吗?

1 个答案:

答案 0 :(得分: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>

您可以将XML嵌入到XSLT中,而不是将XSLT嵌入到test.xml中,而是将其保存为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 />

但是你还需要一个模板来忽略&#34;输入&#34;中的xsl:元素。 XML

    <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文件