代码之家  ›  专栏  ›  技术社区  ›  RyosanCiffer

XSLT结果文档抑制或替换不允许的windows文件名字符

  •  0
  • RyosanCiffer  · 技术社区  · 7 年前

    <xsl:character-map name="winfilename">
        <xsl:output-character character="&#34;" string="&#39;"/>
        <xsl:output-character character="&#58;" string="&#59;"/>
        <xsl:output-character character="&#60;" string="&#40;"/>
        <xsl:output-character character="&#62;" string="&#41;"/>
        <xsl:output-character character="&#47;" string="&#45;"/>
        <xsl:output-character character="&#92;" string="&#45;"/>
        <xsl:output-character character="&#63;" string="&#33;"/>
        <xsl:output-character character="&#94;" string="&#39;"/>
    </xsl:character-map> 
    

    但当我在“结果文档”中使用“使用角色映射”时,它不起作用。 怎么了?

    编辑:这是代码的开头

    <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="&#34;" string="&#39;"/>
        <xsl:output-character character="&#58;" string="&#59;"/>
        <xsl:output-character character="&#60;" string="&#40;"/>
        <xsl:output-character character="&#62;" string="&#41;"/>
        <xsl:output-character character="&#47;" string="&#45;"/>
        <xsl:output-character character="&#92;" string="&#45;"/>
        <xsl:output-character character="&#63;" string="&#33;"/>
        <xsl:output-character character="&#94;" string="&#39;"/>
    </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,'[&quot;&lt;&gt;/\:?^]','[&apos;&#40;&#41;--;!-]')}.dat" method="text" encoding="UTF-8">
    

    我终于可以进行流式处理和序列化了,但一些sflname字符串包含用于windows pathfile的invalids char,所以我想对它们进行翻译,以免失去可读性。但即使我以肖恩为例。

    <xsl:template match="db_entry">
        <xsl:result-document href="file:///E:/result/{translate(./public_data/sflname,'[&quot;&lt;&gt;&#47;&#92;&#58;&#63;&#94;]','[&apos;&#40;&#41;&#45;&#45;&#59;&#33;&#39;]')}.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
    

    顺致敬意,

    1 回复  |  直到 7 年前
        1
  •  1
  •   Martin Honnen    7 年前

    当序列化结果树中的文本数据时,而不是使用文件名时,将应用字符映射。所以你需要使用 replace 构造文件名的函数,例如。 <xsl:result-document href="replace(url, '[list of characters here]', '')"> url 在代码段中,这是一个示例元素名,包含文件名和要删除或替换的字符。

    在您的代码段中,您必须创建一个URI,该URI使用正向斜杠,而不是

    <xsl:result-document href="file:///E:\result\//{./public_data/sflname}.dat" method="text" encoding="UTF-8" use-character-maps="wf">
    

    你需要

    <xsl:result-document href="file:///E:/result/{public_data/sflname}.dat" method="text" encoding="UTF-8" use-character-maps="wf">
    

    如果 public_data/sflname

    <xsl:result-document href="file:///E:/result/{replace(public_data/sflname, '[list of characters]', '')}.dat" method="text" encoding="UTF-8" use-character-maps="wf">
    

    如前所述,字符映射仅对您要创建的输出中的文本数据进行的任何替换有用,而不是文件名或URI。

    至于你最近的挣扎 translate

    <xsl:param name="chars-to-be-replaced" as="xs:string">&quot;&lt;&gt;&#47;&#92;&#58;&#63;&#94;</xsl:param>
    <xsl:param name="replacement-chars" as="xs:string">&apos;&#40;&#41;&#45;&#45;&#59;&#33;&#39;</xsl:param>
    

    然后在你的翻译通话中,你可以简单地使用

    <xsl:result-document href="file:///E:/result/{translate(./public_data/sflname, $chars-to-be-replaced, $replacement-chars)}.dat" method="text" encoding="UTF-8">
    

    <xsl:param name="chars-to-be-replaced" as="xs:string"><![CDATA["<>/\:?^]]></xsl:param>
    

    分别地

    <xsl:param name="replacement-chars" as="xs:string">'()--;!'</xsl:param>