【问题标题】:How to use two (or more) xml files in one xsl document?如何在一个 xsl 文档中使用两个(或多个)xml 文件?
【发布时间】:2013-11-03 21:40:32
【问题描述】:

我一直在努力让同一个 xsl 文件处理两个(或更多)XML 文件。

我按照这篇文章中的步骤操作:Including an XML file in an XML/XSL file,但我无法让它工作。

我似乎无法加载要处理的文件,没有错误。

这是第一个 xm 文件 - Dial_Stats_MWB:

<?xml version="1.0" encoding="utf-8"?>
<UK_Products_Pipeline>
  <LastFinishCode>
    <SiteName>UK</SiteName>
    <LastFinishCode>Agent Logout</LastFinishCode>
    <Numbers>1</Numbers>
  </LastFinishCode>
  <LastFinishCode>
    <SiteName>UK</SiteName>
    <LastFinishCode>Busy</LastFinishCode>
    <Numbers>1</Numbers>
  </LastFinishCode>
  <LastFinishCode>
    <SiteName>UK</SiteName>
    <LastFinishCode>BW Sale</LastFinishCode>
    <Numbers>1</Numbers>
  </LastFinishCode>
</UK_Products_Pipeline>

第二个文件 - Dial_Stats_UK:

<?xml version="1.0" encoding="utf-8"?>
<UK_Products_Pipeline>
  <LastFinishCode>
    <SiteName>MWB</SiteName>
    <LastFinishCode>Bearer Capability Not Presently Authorized (ISDN Cause Code 57)</LastFinishCode>
    <Numbers>1</Numbers>
  </LastFinishCode>
  <LastFinishCode>
    <SiteName>MWB</SiteName>
    <LastFinishCode>Confirmed Booking</LastFinishCode>
    <Numbers>1</Numbers>
  </LastFinishCode>
  <LastFinishCode>
    <SiteName>MWB</SiteName>
    <LastFinishCode>Lost</LastFinishCode>
    <Numbers>1</Numbers>
  </LastFinishCode>
</UK_Products_Pipeline>

XSL 文件:

<?xml version="1.0" encoding='utf-8'?>
<xsl:stylesheet xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html>
      <head>
        <title> XSLT with XML included </title>
      </head>
      <body style="background-color:lightblue;color:green">
        <table cellSpacing="0" border="1" cellPadding="2">
          <!-- Set Variables -->
          <xsl:variable name="external">
            <xsl:copy-of select="document('D:\DATA\Marquee\dial_stats_UK.xml')/*"/>
          </xsl:variable>
          <!-- Process Data Start -->
          <xsl:for-each select="//UK_Products_Pipeline/LastFinishCode">
            <tr>
           <xsl:if test="SiteName ='MWB'">
                <td>
                  <xsl:value-of select="SiteName"/>
             </td>
                <td>
                  <xsl:value-of select="LastFinishCode"/>
                </td>
                <td>
                  <xsl:value-of select="Numbers"/>
                </td>
              </xsl:if>
            </tr>
          </xsl:for-each>
          <!-- Process File Data Start -->
            <xsl:call-template name="ExternalData">
            <xsl:with-param name="data" select="$external"/>
           </xsl:call-template>
        </table>
      </body>
    </html>
    </xsl:template>
  <xsl:template name="ExternalData">
    <xsl:param name="data"/>
    <xsl:variable name="external">
      <xsl:copy-of select="document('D:\DATA\Marquee\dial_stats_UK.xml')/*"/>
    </xsl:variable>
    <table cellSpacing="0" border="1" cellPadding="2" style="background-color:white;color:black">
        <tr>
          <td>
            I do see this.
          </td>
        </tr>
        <!-- Process External Data -->
        <xsl:for-each select="//UK_Products_Pipeline/LastFinishCode">
          <tr>
            <td>
              <xsl:value-of select="SiteName"/>
            </td>
          </tr>
          <tr>
          <xsl:if test="SiteName ='UK'">
            <td>
              <xsl:value-of select="SiteName"/>
            </td>
            <td>
              <xsl:value-of select="LastFinishCode"/>
            </td>
            <td>
              <xsl:value-of select="Numbers"/>
            </td>
          </xsl:if>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

当处理发生时,再次处理相同的文件而不是第二个文件。

我不知道您是否可以就我在这里做错了什么给我任何建议?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    改变

    `<xsl:for-each select="//UK_Products_Pipeline/LastFinishCode">` 
    

    `<xsl:for-each select="document('file:///D:/DATA/Marquee/dial_stats_UK.xml')/UK_Products_Pipeline/LastFinishCode">`
    

    在要处理来自第二个输入文件的数据的模板中。

    虽然更简洁的方法是为您要处理的第二个文件中的节点编写具有模式的匹配模板。 然后你会这样做:

    `<xsl:apply-templates select="document('file:///D:/DATA/Marquee/dial_stats_UK.xml')/UK_Products_Pipeline" mode="my-mode"/>` 
    

    你的模板会输出你想要的表格。

    【讨论】:

    • 这确实解决了问题,我想我的错误是您必须直接寻址文件中的每个位置,而不是在加载后使用相对寻址。非常感谢您的建议!
    • 您可以使用 apply-templates 或 for-each 来确保上下文节点来自辅助输入文件,然后您可以使用相对路径。但是,执行调用模板不会更改上下文节点。
    【解决方案2】:

    请注意,document() 与 XML 家族中的许多其他东西一样,适用于 URI,而不是 Windows 文件名。规范的一些实现允许您使用 Windows 文件名代替 URI,但很多都不允许,因此最好不要依赖它。例如

    d:\data\marquee\stats.xml
    

    是 Windows 文件名,而不是 URI。对应的URI是

    file:///d:/data/marquee/stats.xml
    

    【讨论】:

    • 非常感谢您的解释。我需要使用共享目录来提取文件,这会是:file:///servername/sharename/stats.xml 还是其他不同的东西?
    • 如果您使用的是 UNC 文件名,它们到 URI 的映射是一种黑色艺术。在以前的 Saxon 版本中有一些关于 UNC 文件名和 URI 的(经验性)信息:sourceforge.net/apps/mediawiki/saxon/…,但它可能不适用于当前版本或其他 XSLT 处理器。我认为我的建议是通过 HTTP 而不是通过 UNC 访问文件。
    • 谢谢,但不幸的是我无法控制它来自的“SQL”服务器,他们无法让我在那里安装 http 或事件来“添加”目录文件作为虚拟目录写入远程 http 服务器。我有点手被绑在这里。
    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多