【发布时间】:2025-12-06 12:35:01
【问题描述】:
我使用 xslt 3.0 输出几个带有结果文档的文件,但 Windows 文件名中有非法字符,例如 " 所以我尝试使用字符映射:
<xsl:character-map name="winfilename">
<xsl:output-character character=""" string="'"/>
<xsl:output-character character=":" string=";"/>
<xsl:output-character character="<" string="("/>
<xsl:output-character character=">" string=")"/>
<xsl:output-character character="/" string="-"/>
<xsl:output-character character="\" string="-"/>
<xsl:output-character character="?" string="!"/>
<xsl:output-character character="^" string="'"/>
</xsl:character-map>
但是当我将“use-character-maps”与“result-document”一起使用时它不起作用。 怎么了?
编辑:这是代码开始
<xsl:output method="text" encoding="UTF-8" indent="yes" use-character-maps="wf"/>
<xsl:mode name="start" streamable="yes"/>
<xsl:character-map name="wf">
<xsl:output-character character=""" string="'"/>
<xsl:output-character character=":" string=";"/>
<xsl:output-character character="<" string="("/>
<xsl:output-character character=">" string=")"/>
<xsl:output-character character="/" string="-"/>
<xsl:output-character character="\" string="-"/>
<xsl:output-character character="?" string="!"/>
<xsl:output-character character="^" string="'"/>
</xsl:character-map>
<xsl:template match="/" mode="start">
<xsl:apply-templates select="databank_export/copy-of(db_entry)" mode="entry"/>
</xsl:template>
<xsl:template match="db_entry">
<xsl:result-document href="file:///E:\result\//{./public_data/sflname}.dat" method="text" encoding="UTF-8" use-character-maps="wf">
<xsl:apply-templates select="public_data"/>
</xsl:result-document>
</xsl:template>
这不起作用:错误 XTSE0350 未转义的左花括号 我应该转义大括号吗?
<xsl:result-document href="file:///E:/result/{replace(./public_data/sflname,'["<>/\:?^]','['()--;!-]')}.dat" method="text" encoding="UTF-8">
我想将数据库的每个条目输出到“sflname”.dat 文件。 我终于让流和序列化工作了,但是一些 sflname 字符串包含 Windows 路径文件的无效字符,所以我想翻译它们以免失去可读性。但即使我按照你肖恩的例子。
<xsl:template match="db_entry">
<xsl:result-document href="file:///E:/result/{translate(./public_data/sflname,'["<>/\:?^]','['()--;!']')}.dat" method="text" encoding="UTF-8">
<xsl:apply-templates select="public_data"/>
</xsl:result-document>
</xsl:template>
我收到以下错误:
Unexpected token ';!']')'
Erreur d'emplacement : xsl:stylesheet / xsl:template / xsl:result-document / @href
Détails
XPST0003: The expression around 'sflname,'["<>/\:?^]','['()--;!']')' is not a valid instance of the XPath grammar
为什么?我应该删除方括号吗?某些字符是否需要双重转义?我是一个非常初学者,我不知道。根据 w3 xpath refs 和示例,这似乎是正确的。
最好的问候
【问题讨论】:
-
你为什么不简单地使用
translate()函数? -
不清楚你想用你最近的
replace尝试实现什么,通常第二个字符串是替换字符串,而不是替换字符列表。因此,如前所述,translate可能是一个更好的工具,如果您想用另一个字符串中的相应字符替换字符串中的每个字符。见w3.org/TR/xpath-functions-31/#func-replace 和w3.org/TR/xpath-functions-31/#func-translate -
我想将数据库的每个条目输出到“sflname”.dat 文件。我终于让流和序列化工作了,但是一些 sflname 字符串包含 Windows 路径文件的无效字符,所以我想翻译它们以免失去可读性。
-
查看我对如何在字符串中安全使用单引号的一种方法的回答的编辑。