document() 函数在 XSLT 中如何工作?

Posted

技术标签:

【中文标题】document() 函数在 XSLT 中如何工作?【英文标题】:How does the document() function work in XSLT? 【发布时间】:2020-07-23 17:34:35 【问题描述】:

所以基本上我一直在努力让 xslt 中的 document() 函数正常工作,但是我找不到适合我的生活的方法。我被告知要使用 XMLTools 插件在 Notepad++ 中学习它并转换 xml。

我已经创建了 2 个包含简短数据的基本 xml 文件,但我什至无法将这两个文件链接在一起,因为我在网上找不到任何学习帮助。

我的第一个xml名为cars.xml:

<?xml version="1.0"?>
<!DOCTYPE cars SYSTEM "cars.dtd">
<cars>
    <car>
        <carManufacturer>BMW</carManufacturer>
        <carModel>1 Series</carModel>
        <carYear>2013</carYear>
        <carPrice>£7,950</carPrice>
    </car>
    <car>
        <carManufacturer>BMW</carManufacturer>
        <carModel>3 Series</carModel>
        <carYear>2014</carYear>
        <carPrice>£9,950</carPrice>
    </car>
</cars>

还有我的第二个名为customers.xml的xml文件:

<?xml version="1.0"?>
<!DOCTYPE customers SYSTEM "cars.dtd">
<customers>
    <customer>
        <firstName>John</firstName>
        <lastName>Smith</lastName>
        <location>Carterton</location>
    </customer>
    <customer>
        <firstName>Jeremy</firstName>
        <lastName>Clarkson</lastName>
        <location>Chipping Norton</location>
    </customer>
</customers>

这是我到目前为止在我的 xsl 中提出的,但我没有得到任何地方:

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

    <xsl:output method="html" indent="no"/>
    <xsl:template match="/">
        <xsl:call-template name="StartHTML">
            <xsl:with-param name="Title" select="'Cars'"/>
        </xsl:call-template>
    </xsl:template>
    <!--<xsl:template match="cars">
        <xsl:variable name="CarName">
            <xsl:value-of select="car/carManufacturer"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="car/carModel"/>
        </xsl:variable>

    </xsl:template>-->
</xsl:stylesheet>

任何使用此功能的帮助将不胜感激:)

【问题讨论】:

您可以使用document('cars.xml')document('customers.xml') 访问相应的XML 文件。然后像document('cars.xml')/cars/car[carManufacturer='BMW']这样添加路径,或者类似这样的东西来选择制造商“BMW”的&lt;car&gt;元素。 你想要的结果是什么?如果我们不知道您的最终目标,我们将无法帮助您。 我在你的 XSLT 中没有看到对 document() 的调用,所以很难看出你做错了什么。 我只是希望 firstName 节点与汽车一起显示在输出中。此代码用于示例目的,但我只需要从外部 xml 移动特定节点。我不明白 document() 函数的去向,或者它是否用于模板等。 【参考方案1】:

根据您的问题,不清楚您的两个文件是如何链接的......

document函数可以简单的这样使用:

<xsl:variable name="carsFile" select="document('cars.xsml')"/>

然后例如可以用在:

<xsl:value-of select="$carsFile/cars/car/carManufacturer"/>

此外,如果您无法访问 XML/XSLT 开发环境(XMLSpy、Oxygen XML 等),根据我的经验,Notepad++ 中的 XMLTools 插件对于不经常需要它们的用户来说很昂贵很难使用,而且错误消息并不总是很容易解码。

我建议您继续在 Notepad++ 中编辑您的 XSLT,并使用一个简单的批处理文件在文件上运行 Saxon,如下所示:

java -cp saxon9he.jar net.sf.saxon.Transform -t -s:input.xml -xsl:transform.xsl -o:output.xml

【讨论】:

我正在尝试这个,但我仍然得到一个正在生成的空文档,我使用的代码看起来像:w3.org/1999/XSL/Transform"> 我选择在 Notepad++ 中使用它,因为我将在未来的研究中使用它。

以上是关于document() 函数在 XSLT 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

XML - XSLT - count() 函数内的 document() 函数

XSLT - 在多个文件时选择唯一元素

在 WebLogic 中使用相对路径调用 xslt document() 函数

c# / xslt - XmlResolver 未被 document() 函数调用

如何在 PHP 5 中启用 XSLT 函数?

使用XSLT检索XML文件名