在XML/XSL文件中包含XML文件

Joo*_*kia 23 xml xslt

所以目前我正在做一些XML-> XSLT->(HTML5/CSS3)工作.现在我有一个menu.xml文件,我想将它包含在XSL文件或XML页面中.我做了很多搜索,但我找不到直截了当的答案.

那么,如何将XML文件包含到另一个XML文件或XSL文件中?

编辑:通过包含,我的意思是从其他文件引用/加载它,而不是复制和粘贴它或只是嵌入它.

Dim*_*hev 36

I.以下是如何将任何XML文档或片段嵌入到XSLT样式表中并在转换过程中使用:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:menu>
   <menu>
     <choice>A</choice>
     <choice>B</choice>
     <choice>C</choice>
   </menu>
 </my:menu>

 <xsl:template match="/">
  <xsl:copy-of select="document('')/*/my:menu/*"/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于任何XML文档(本示例中未使用)时,将生成所需结果(仅复制XML):

<menu xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my">
   <choice>A</choice>
   <choice>B</choice>
   <choice>C</choice>
</menu>
Run Code Online (Sandbox Code Playgroud)

请记住:任何XML都可以嵌入到XSLT样式表中,前提是它包装在命名空间元素(命名空间而不是XSLT命名空间)中,并且此包装元素位于全局级别(<xsl:stylesheet>(顶部)元素的子级).

II.访问驻留在单独XML文件中的XML菜单文件:

要做到这一点,我们只需稍微改变前面的例子:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>


 <xsl:template match="/">
  <xsl:copy-of select="document('menu.XML')/*"/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

如果菜单XML文件位于'menu.XML'文件中(与XSLT样式表文件位于同一目录中,则此转换将产生与上一个完全相同的结果:

<menu>
   <choice>A</choice>
   <choice>B</choice>
   <choice>C</choice>
</menu>
Run Code Online (Sandbox Code Playgroud)

请注意:在这两种情况下,我们都使用标准的XSLT功能document()

通常,定义一个全局级变量,其值是调用document()函数的结果.然后在转换期间通过XPath表达式访问此变量及其内容.

  • @ lysergic-acid:是的,为什么你认为这是不可能的?只需尝试`<xsl:apply-templates select ="document('menu.XML')/*"/>`或者你喜欢的任何东西,看看它是否正常工作. (3认同)

Mad*_*sen 5

那么,如何将XML文件包含到另一个XML文件或XSL文件中?

您可以使用外部实体来引用menu.xml文件,并将内容包含在XML文件或XSLT(或两者)中.

通过include,我的意思是从另一个文件引用/加载它,而不是复制和粘贴它或简单地嵌入它.

通过使用外部实体,您可以从外部文件引用/加载menu.xml内容,而不必复制XML内容.

例如,如果您想要XSLT中包含的menu.xml内容,您可以在XSLT中声明外部实体,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [
     <!ENTITY menu SYSTEM "./menu.xml">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Run Code Online (Sandbox Code Playgroud)

然后可以像任何其他实体一样引用它:

&menu;
Run Code Online (Sandbox Code Playgroud)

解析XSLT时,将扩展实体引用,并将menu.xml的XML内容作为XSLT文档的一部分包含在内,就像您已复制/粘贴到实体引用所在的位置一样.