【问题标题】:XSLT transformation - multiple input XML filesXSLT 转换 - 多个输入 XML 文件
【发布时间】:2013-01-07 04:10:44
【问题描述】:

我有以下问题:我有几个输入 XML 文件,其中一个包含指向其他文件的链接。 那个看起来像这样:

<Envelope>
<Part File='file:SEQ014/DET3262874.9.0.xml' LinkType='REL' DocType='XCD' SubType='Call' Format='XML'/>
<Part File='file:SEQ014/DET3262874.9.1.xml' LinkType='REL' DocType='XCD' SubType='Call' Format='XML'/>
<Part File='file:SEQ014/DET3262874.9.2.xml' LinkType='REL' DocType='XCD' SubType='Call' Format='XML'/>
<Part File='file:SEQ014/DET3262874.9.3.xml' LinkType='REL' DocType='XCD' SubType='Call' Format='XML'/>
<Part File='file:SEQ014/DET3262874.9.4.xml' LinkType='REL' DocType='XCD' SubType='Call' Format='XML'/>
<Part File='file:SEQ014/DET3262874.9.5.xml' LinkType='REL' DocType='XCD' SubType='Charge' Format='XML'/>
<Part File='file:SEQ014/INV3262874.9.xml' LinkType='REL' DocType='INV' Format='XML'/>
<Part File='file:SEQ014/INVINFO3262874.9.xml' LinkType='REL' DocType='IIN' Format='XML'/>
<Part File='file:SEQ014/SUM3262874.9.xml' LinkType='REL' DocType='SUM' Format='XML'/>
<Part File='file:SEQ014/BAL3262874.9.xml' LinkType='REL' DocType='BAL' Format='XML'/>
<Part File='file:SEQ014/ADDR3262874.9.xml' LinkType='REL' DocType='ADD' Format='XML'/>
</Envelope>

现在,我正在像这样访问底部的文件:

<xsl:param name="BillingDocument2" select="/Bill/Part[@DocType='ADD']/@File"/>
<xsl:param name="BillingDocument3" select="/Bill/Part[@DocType='INV']/@File"/>
etc...

在那之后,我是这样引用它们的:

<xsl:variable name="var13_Document" select="document($BillingDocument2)/Document"/>
etc...

但是,我不知道如何使用前 5 个 XML 文件中的数据?所有这些文件具有相同的结构,基本上,它是一个大文件,分成 5 个较小的文件...... 我需要将这 5 个文件中的所有数据(它们的数量因情况而异)放在一个地方,所以我可以以相同的方式处理它...... 哦,是的,我只能使用 XSLT1!

【问题讨论】:

    标签: xml xslt foreach merge concat


    【解决方案1】:

    答案基本上与您访问其他答案的方式相同。如果你说

    <xsl:param name="XCDDocs" select="/Bill/Part[@DocType='XCD']/@File"/>
    

    那么这会给你一个变量,它的值是一组 5 个节点(来自五个 Part 元素中的每一个的 File 属性节点)。现在,当您将一个节点集传递给document 函数时,您将返回另一个节点集,该节点集由文档中的根节点组成,其URI 由原始集中每个节点的字符串值给出。因此

    document($XCDDocs)/Document
    

    是一组五个节点,五个文件中每一个的Document元素,并且

    <xsl:apply-templates select="document($XCDDocs)/Document/*" />
    

    将为所有五个文件中的文档元素的所有第一级子元素应用模板,等等。

    【讨论】:

    • 感谢您的回答,但是,这是我尝试的第一件事,但它没有工作 - 好像它没有得到任何 DET 文件......这就是我的方式我稍后会访问它:codecode 我想我需要一些 for-each 循环?
    • @cameron 这绝对符合 DET 文件中 XML 的格式 - 它们有一个名为 Document 的根元素,没有命名空间?
    • 嗨,仍然无法正常工作:现在是这样 有什么提示吗?
    • @cameron 再次查看问题中的示例 XML,您说您正在使用像 /Bill/Part[....] 这样的 XPath,但您的示例 XML 将 Envelope 作为其文档元素,因此它们应该是 /Envelope/Part[...] .在您的真实 XML 中也是这种情况,还是只是在您在此处发布的版本中?
    • 终于成功了! :) 我使用了动态名称生成...谢谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多