Xml 如何用xslt将所有非英语字母(字符)替换为空格
我有一个包含不同语言的Unicode XML文件。我需要将所有非英语字母替换为文件中的空格。这是该文件的一个示例。通过XSLT1.0Xml 如何用xslt将所有非英语字母(字符)替换为空格,xml,xslt,Xml,Xslt,我有一个包含不同语言的Unicode XML文件。我需要将所有非英语字母替换为文件中的空格。这是该文件的一个示例。通过XSLT1.0 <NameValue> <EntityName>Kai</EntityName> <OriginalScriptName>住吉</OriginalScriptName> <OriginalScriptName>すみかい</OriginalScriptName>
<NameValue>
<EntityName>Kai</EntityName>
<OriginalScriptName>住吉</OriginalScriptName>
<OriginalScriptName>すみかい</OriginalScriptName>
<OriginalScriptName>スシカイ</OriginalScriptName>
</NameValue>
凯
住吉
すみかい
スシカイ
预期结果
<NameValue>
<EntityName>Kai</EntityName>
<OriginalScriptName> </OriginalScriptName>
<OriginalScriptName> </OriginalScriptName>
<OriginalScriptName> </OriginalScriptName>
</NameValue>
凯
我试过XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:my-scripts="urn:my-scripts" exclude-result-prefixes="msxsl">
<xsl:output method="text"/>
<msxsl:script language="C#" implements-prefix="my-scripts"><![CDATA[
public string fReplaceNonASCIICharacters(string inStr)
{
return Regex.Replace(inStr," ", @"[^\x20-\x7E]");
}
]]></msxsl:script>
<xsl:template match="OriginalScriptName">
<xsl:value-of select="(my-scripts:fReplaceNonASCIICharacters(.))"/>
</xsl:template>
</xsl:stylesheet>
基于Ian的评论(假设我们可以将空格
设置得足够长,以覆盖所有可能的输入数据):
到目前为止您尝试过什么吗?为什么您的示例将2个字符和4个字符分别替换为8个空格?更重要的是,你为什么要做这样的替换呢?丢弃所有真实信息,但保留其原始大小似乎是毫无意义的。@michael.hor257k这是一个错误,您是对的,只需要1:1的替换。因为有时候价值会像Kai一样住 スシカイ 我仍然需要“Kai”…@IanRoberts,嗨,Ian更新了我在主要帖子中尝试的代码,thxFYI,你是说非拉丁字符。没有英文字符。替换字符串需要的空格与翻译(,$ascii字母,)
中的字符一样多,否则您只需将第一个非ascii字符替换为空格并删除其他字符。除了Ian Roberts提到的问题外,这是一个很好的解决方案。如果EXSLT函数str:padding
可用,您可以使用str:padding(string-length())
@IanRoberts创建一个合适的替换字符串,您当然是对的,我的XPath 1.0技能似乎正在衰退,目前我已经更正了代码,至少提供了一个带有两个空格的空格参数。谢谢大家,这很有帮助:)谢谢大家,这很有帮助:)想想我们有没有选择来处理所有ascii字符?像“and>这种符号,实际上我在寻找是否有一种方法可以保留所有这些符号和字母,这些符号和字母只能由我们的键盘输入,即Ascii Oct 040-176(HTML ;to~;)。我试图一个接一个地输入“Ascii字母xsl变量”,但在“位置”失败。。。
<xsl:variable name="ascii-letters"
select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'"/>
<xsl:param name="spaces" select="' '"/>
<xsl:template match="OriginalScriptName">
<xsl:copy>
<xsl:variable name="non-ascii-letters" select="translate(., $ascii-letters, '')"/>
<xsl:value-of select="translate(., $non-ascii-letters, $spaces)"/>
</xsl:copy>
</xsl:template>