我正在努力处理一个处理文件列表的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处理此问题时,它抱怨它无法找到文件 &#34; 7olution.xml&#34;
XLST将此指定为输出:
<xsl:output method="xml" escape-uri-attributes="no" />
感谢escape-uri-attributes =&#34; no&#34;,URI在转换后的XML中正确显示。我还没有能够找到适用于document()的等效函数。 我怎样才能确保document()将%视为文字而不是转换它?
答案 0 :(得分:1)
尝试使用<xsl:variable name="sourcedoc" select="concat('file:///', encode-for-uri(.))"/>
,doc
或document
等函数可以使用URI,百分号需要转义,所以如果您的文件名带有百分号,建议的函数就会将其转义根据需要,以便doc
或document
功能起作用。
答案 1 :(得分:1)
我再次看到这个,并认为如果你的输入包含文件名而不是URI,特别是如果文件名有任意风格,处理它们的最佳方法可能是使用EXPath文件模块。那就是:
parse-xml(file:read-text($filename))
或者
doc(file:path-to-uri($filename))
在一般情况下将文件名转换为URI的逻辑非常复杂,当然比在前面粘贴file:///
更复杂,而EXPath文件模块试图解决这个问题,标准函数库没有。