【问题标题】:document() function and filenames that contain %document() 函数和包含 % 的文件名
【发布时间】:2018-04-18 07:14:51
【问题描述】:

我正在为处理文件列表的 XSL 苦苦挣扎。对于大多数文件,该函数可以正常工作,但是当文件名包含 % 符号时它会崩溃。

这是我的 XSLT:

   <xsl:template match="file">
     <xsl:variable name="sourcedoc" select="concat('file:///', text())"/>
     <madcapfile>
        <xsl:attribute name="filename"><xsl:value-of select="text()"/></xsl:attribute>
        <xsl:apply-templates select="document($sourcedoc)"/>
     </madcapfile>
   </xsl:template>

和我的带有文件列表的 XML:

<file>the 7% solution.xml</file>

在 Saxon 中处理此问题时,它抱怨找不到文件 "7olution.xml"

XLST 将其指定为输出:

<xsl:output method="xml"  escape-uri-attributes="no" />

感谢 escape-uri-attributes="no",URI 在转换后的 XML 中正确显示。我一直无法找到适用于 document() 的等效函数。 如何确保 document() 将 % 视为文字而不是转换它?

【问题讨论】:

    标签: xslt saxon


    【解决方案1】:

    尝试&lt;xsl:variable name="sourcedoc" select="concat('file:///', encode-for-uri(.))"/&gt;docdocument 等函数与 URI 一起使用,百分号需要转义,因此如果您的文件名带有百分号,建议的函数将根据需要对其进行转义,以便 @ 987654324@ 或 document 函数将起作用。

    【讨论】:

    • 补充一点:document() 的参数不是文件名,而是 URI。更严格地说,它是一个标记序列,每个标记都被解释为绝对 URI 或相对 URI 引用;您的字符串都不是,因为 %-sign.
    【解决方案2】:

    我再次查看此内容,并认为如果您的输入包含文件名而不是 URI,特别是如果文件名具有任意风格,处理它们的最佳方法可能是使用 EXPath 文件模块。那就是:

    parse-xml(file:read-text($filename))
    

    或许

    doc(file:path-to-uri($filename))
    

    一般情况下将文件名转换为 URI 的逻辑是相当复杂的,肯定比在前面粘贴 file:/// 更复杂,而 EXPath 文件模块试图解决这个问题,而标准函数库没有' t.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2014-09-04
      • 2016-12-04
      • 1970-01-01
      相关资源
      最近更新 更多