2014-06-18 48 views
1

我有一个包含不同语言的Unicode XML文件。我需要将文件中的所有非英文字母替换为空格。这是该文件的一个例子。通过XSLT 1.0如何用空格替换所有非英文字母(字符)xslt

<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> 
+0

你尝试过什么到目前为止? –

+0

为什么您的示例将每个8个空格替换为2个字符和4个字符?更重要的是,为什么你需要做这样的替换呢?丢弃所有真实信息似乎毫无意义,但保留其原始大小。 –

+0

@ michael.hor257k多数民众赞成在一个错误,你的权利只有1对1替换是必需的。因为somettime的价值将凯姆斯像 Kai住スシイ我仍然需要“凯”... – user3724711

回答

3

基于伊恩的评论(假设我们可以让spaces足够长的时间,以涵盖所有可能的输入数据):

<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> 
+1

替换字符串需要与translate(。,$ ascii-letters,'')'中的字符数一样多的空格,否则只会用空格替换_first_非ASCII字符并删除其他字符。 –

+0

除了Ian Roberts提到的问题外,这是一个不错的解决方案。如果EXSLT函数'str:padding'可用,则可以使用'str:padding(string-length())'创建合适的替换字符串。 – nwellnhof

+0

@IanRoberts,你当然是对的,似乎我的XPath 1.0技能正在消失,我已经通过至少提供了一个空格参数和一些空格来纠正当前的代码。 –

相关问题