【问题标题】:How can I save an xml containing multiple xml:base attributes to multiple files如何将包含多个 xml:base 属性的 xml 保存到多个文件
【发布时间】:2018-07-31 13:43:12
【问题描述】:

我有一个类似的 xml 文件:

<main xmlns:xi="http://www.w3.org/2001/XInclude">
  <level1 xml:base="./include1/include1.xml">
    <level2 xml:base="./include1/include2/include2.xml">
      <level3 xml:base="./include2/include3/include3.xml">
        <level4 xml:base="./include3/include4/include4.xml">
          <data>0</data>
          <data>1</data>
        </level4>
      </level3>
    </level2>
  </level1>
</main> 

该文件是通过使用 xi:include 组装多个 xml 文件生成的。 具体来说,示例中的文件是由以下文件生成的:

./main.xml

<?xml version="1.0" encoding="UTF-8" ?>
<main  xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="./include1/include1.xml" />
</main >

./include1/include1.xml

<?xml version="1.0" encoding="UTF-8" ?>
<level1  xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="./include2/include2.xml" />
</level1 > 

./include1/include2/include2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<level2  xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="./include3/include3.xml" />
</level2 > 

./include1/include2/include3/include3.xml

<?xml version="1.0" encoding="UTF-8" ?>
<level3  xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="./include4/include4.xml" />
</level3 > 

./include1/include2/include3/include4/include4.xml

<?xml version="1.0" encoding="UTF-8" ?>
<level4  xmlns:xi="http://www.w3.org/2001/XInclude">
    <data> 0 </data>
    <data> 1 </data>
</level4 > 

现在,在对输出文件中的数据进行一些处理后,我想保存原始文件,检索原始文件夹树结构。

我尝试编写自己的 XQuery 脚本来实现这一目标,方法是在输出文件中循环,处理存储在 xml:base 属性中的值并保存文件。

然而,现在,在编写了 150 多行初级 XQuery 代码后,我感到迷茫。

因此我想知道是否有人已经开发了一些实现此功能的 XQuery 或 XSLT 代码(我认为总的来说它应该是一个非常常见的功能......)或者我是否可以使用一些现有的库来执行此任务. 谢谢

【问题讨论】:

    标签: xml xslt xquery


    【解决方案1】:

    我认为你可以在 XSLT 中使用类似的东西相当容易地做到这一点

    <xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:mode on-no-match="shallow-copy">
      <xsl:template match="*[@xml:base]">
        <xi:include href="{@xml:base}"/>
        <xsl:result-document href="{@xml:base}">
          <xsl:copy>
            <xsl:copy-of select="@* except @xml:base"/>
            <xsl:apply-templates/>
          </xsl:copy>
        </xsl:result-document>
      </xsl:template>
    </xsl:transform> 
    

    我看不出你怎么能在 XQuery 中做到这一点,它缺少任何等效的 xsl:result-document

    唯一的困难是在xsl:result-documentxi:include 元素上正确获取href 属性的值。按照我的编写方式,@xml:base 属性中的相对 URI 将根据转换的基本输出 URI 进行解析。使用 base-uri(.) 的值可能会获得更好的结果,它可以针对祖先基 URI 解析它,但问题是它可能是与源文档位于同一目录中的绝对 URI。也许使用 base-uri(.) 和一些前缀剥离使其相对,或者也许使用 OutputURIResolver 来重定向最终输出位置。

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多