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

时间:2011-01-16 01:46:54

标签: xml xslt

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

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

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

5 个答案:

答案 0 :(得分:35)

<强>予。以下是如何将任何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>

当此转换应用于任何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>

记住:任何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>

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

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

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

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

答案 1 :(得分:5)

  

那么,我如何在其中包含XML文件   另一个XML文件或XSL文件?

您可以使用external entity 来引用 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">

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

&menu;

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

答案 2 :(得分:1)

我对此有a blog post。您可以使用document()获取其他XML并使用参数传递内容。

答案 3 :(得分:1)

我无法获得人们提供的代码。但是在尝试了几件事后我确实得到了解决方案。将xml文件命名为clGroup.xml(前两个字母不重要,但我发现&#34; Group&#34;是必需的。此xml文件将引用您要解析的xml。

clGroup xml:

 <?xml version='1.0' encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="calendarGroup.xslt" ?>
<groups>
  <groupRef>caGroup.xml</groupRef>
</groups>

现在命名文件caGroup.xml并输入以下代码:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<topics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <topic>
        <topicstopic>Calendar</topicstopic>
        <topicsubmitter>Calendar</topicsubmitter>
        <creatoremail>joeshowfakeaccount@gmail.com</creatoremail>
    </topic>
    <topic>
        <name>Week1</name>
        <sunday/>
        <monday/>
        <tuesday>Test01 Young Men Weekly</tuesday>
        <wednesday>02 Elders Home Teaching Message Birthday</wednesday>
        <thursday>03 </thursday>
        <friday>04 </friday>
        <saturday>05  #Young Men Weekly</saturday>
    </topic>
    <topic>
        <name>Week2</name>
        <sunday>06 Fast Sunday</sunday>
        <monday>07 FHE</monday>
        <tuesday>08 Young Men Tonight #Young Men Weekly going to Bishops storehouse 6PM to 7PM Young Men Weekly</tuesday>
        <wednesday>09 </wednesday>
        <thursday>10 Scout Round Table at 7 PM </thursday>
        <friday>11 </friday>
        <saturday>12 </saturday>
    </topic>
  </topics>

现在这是我的XSLT文件calendarGroup.xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" 
            version="1.0" 
            encoding="UTF-8" 
            indent="yes"/>

<xsl:template match="groups/groupRef">
  <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title>Table</title>
      <meta charset="utf-8" />
    </head>
    <body>
      <table border="1">
        <tr>
          <th>Sunday</th>
          <th>Monday</th>
          <th>Tuesday</th>
          <th>Wednesday</th>
          <th>Thursday</th>
          <th>Friday</th>
          <th>Saturday</th>
        </tr>         
        <xsl:for-each select="document(.)//topic">
          <xsl:if test="string(name) != ''">
          <tr>
            <td>
              <xsl:value-of select="sunday"/>
            </td>
            <td>
              <xsl:value-of select="monday"/>
            </td>
            <td>
              <xsl:value-of select="tuesday"/>
            </td>
            <td>
              <xsl:value-of select="wednesday"/>
            </td>
            <td>
              <xsl:value-of select="thursday"/>
            </td>
            <td>
              <xsl:value-of select="friday"/>
            </td>
            <td>
              <xsl:value-of select="saturday"/>
            </td>
          </tr>
          </xsl:if>
        </xsl:for-each>
      </table>
    </body>
  </html>
</xsl:template>
</xsl:stylesheet>

以这种方式设置代码的好处是我可以轻松地从excel文件创建xml,而不是在新创建的文件中放入声明语句的一半。你需要有格式&#34; xxGroup&#34;为了这个一起工作。您可以向clGroup文件添加更多组,它们将在XSLT中进行解析,允许您在同一个XSLT解析器中包含更多xml。确保它们都在同一目录中。

答案 4 :(得分:0)

如果只是将文件嵌入XML文件中不是解决方案,那么应该添加解释程序读取的url字段 - 你基本上要求相当于include(menu.xml)或require(xml) ),但在XML文件中。

因此,由于您正在编写解释文件的程序,您可以添加<externalMenuTagThatYouDecideToAddToTheBaseXmlFile>标记或任何您想要调用的标记,您将读取并插入menu.xml的根注释{{1 }}

祝你好运,你的程序总是可以编译。