如何将xsl嵌入xml文件

j

我有一个档案 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>

我可以加入这一行,正确地让页面显示<?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线程上执行以下步骤将返回空白页面或未格式化的页面

我有什么想念的吗?

C队

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 />

但是您还需要一个模板来忽略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文件

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章