当前位置: 首页 > 知识库问答 >
问题:

XSLT文件过滤以字符开头和后跟字符

宇文鸣
2023-03-14

我在一个项目中工作,那里给了我一个允许的字符列表,并要求我删除不需要的字符。我已经完成了以下工作,但我觉得它很麻烦,而且超出了应有的范围

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="follow">0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ?abcdefghijklmnopqrstuvwxyz-&apos;.,/@&amp;()!+</xsl:variable>
    <xsl:variable name="start">0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ?abcdefghijklmnopqrstuvwxyz</xsl:variable>
    <xsl:template match="/">
        <html>
            <body>
                <xsl:choose>
                    <xsl:when test="contains($start, substring(normalize-space(/Author/Name/FirstName),1,1)) and 
                    string-length(substring(normalize-space(/Author/Name/FirstName),1,1)) > 0 and
                    string-length(translate(substring(normalize-space(/Author/Name/FirstName),2),translate(substring(normalize-space(/Author/Name/FirstName),2),$follow,''),'')) &gt; 0">
                        <div>
                            <xsl:value-of select="translate(substring(normalize-space(/Author/Name/FirstName),1),
                            translate(substring(normalize-space(/Author/Name/FirstName),1),$follow,''),'')" />
                        </div>    
                    </xsl:when>
                    <xsl:otherwise>NULL</xsl:otherwise>
                </xsl:choose>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

在测试启动条件时,我添加了三个检查。contains检查为空字符串大小写返回true,因此我添加了字符串长度条件,以便为空字符串大小写返回NULL。

FirstName>?    #</FirstName>//NULL
<FirstName></FirstName>//NULL
<FirstName>   ??</FirstName>//??
<LastName>?t*#</LastName>//?t

我用于测试的XML如下

<?xml version="1.0" encoding="UTF-8"?>
<Author>
    <Name>
        <FirstName>xxx</FirstName>
    </Name>
</Author>

我可能遗漏了任何边缘情况,我的问题是,有没有更好的方法来解决起始字符和连续字符是有条件的XSLT过滤任务?

编辑阅读michael.hor257k评论让我质疑我的方法并更了解我的要求。有一个Cybersource页面,它在向他们的api发出请求时指定允许的字符。我的目标是清理不需要的字符,并确保字段开头和后面的字符符合网站上给出的规格。以Ship-To Company名称为例。我使用的是带有java Transex类的XSLT 1.0

共有1个答案

李景天
2023-03-14

考虑以下简化示例:

XML

<input>
    <item>alpha</item>
    <item>-alpha</item>
    <item>alp§ha</item>
    <item>---al§pha§</item>
    <item>§al-pha</item>
</input>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="allowed-start-chars">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="allowed-follow-chars">abcdefghijklmnopqrstuvwxyz-</xsl:variable>

<xsl:template match="/input">
    <output>
        <xsl:apply-templates/>
    </output>
</xsl:template>

<xsl:template match="item">
    <!-- find the first character eligible to be starting character -->
    <xsl:variable name="start-chars" select="translate(., translate(., $allowed-start-chars, ''), '')"/>
    <xsl:variable name="start-char" select="substring($start-chars, 1, 1)"/>
    <!-- get text after the chosen starting character -->
    <xsl:variable name="tail" select="substring-after(., $start-char)"/>
    <result original="{.}">
        <xsl:value-of select="$start-char"/>
        <!-- remove unwanted characters from tail -->
        <xsl:value-of select="translate($tail, translate($tail, $allowed-follow-chars, ''), '')"/>
    </result>
</xsl:template>

</xsl:stylesheet>

后果

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <result original="alpha">alpha</result>
   <result original="-alpha">alpha</result>
   <result original="alp§ha">alpha</result>
   <result original="---al§pha§">alpha</result>
   <result original="§al-pha">al-pha</result>
</output>

你可能想添加一个测试,以防所有字符都被证明是非法的——尽管这似乎不太可能。

如果您只想测试输入是否有效,则可以执行以下操作:

<xsl:template match="item">
    <!-- test the first character -->
    <xsl:variable name="valid-start-char" select="contains($allowed-start-chars, substring(., 1, 1))"/>
    <!-- test following characters  -->
    <xsl:variable name="invalid-follow-chars" select="translate(substring(., 2), $allowed-follow-chars, '')"/>
    <result original="{.}">
       <xsl:choose>
        <xsl:when test="$valid-start-char and not($invalid-follow-chars)">
            <xsl:value-of select="."/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
       </xsl:choose>
    </result>
</xsl:template>

得到:

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <result original="alpha">alpha</result>
    <result original="-alpha">NULL</result>
    <result original="alp§ha">NULL</result>
    <result original="---al§pha§">NULL</result>
    <result original="§al-pha">NULL</result>
</output>
 类似资料:
  • JSONException:JSONObject文本必须以字符6处的{开头。

  • 问题内容: 有时,我不知何故在我的主目录中意外创建了一个名为-s的文件。它约为500 kb,我不知道它是否包含重要数据。我无法弄清楚对该文件执行 任何 操作的方法,因为我尝试查看,复制或移动它的每个命令都将文件名解释为参数。 我试过将其用引号引起来,并使用反斜杠将其转义,即两者结合使用,似乎没有任何效果。 另外,当我第一次向同事提出这个问题时,我们困惑了片刻,直到有人终于听到了,然后问:“为什么不

  • 问题内容: 我正在生成一个XML文件进行付款,并且我对用户的全名有一个限制。该参数仅接受字母字符(a-ZAZ)+空格来分隔名称和姓氏。 我无法通过简单的方式对此进行过滤,如何构建正则表达式或过滤器以获得所需的输出? 例: 一定是 我需要将元音转换成带有单个元音的装饰,如下所示:á> a,à> a,â> a,依此类推;等等。并删除特殊字符,如点,连字符等。 谢谢! 问题答案: 您可以先使用规范化器,

  • 必须是 我需要在单元音中变换带有装饰的元音,如下所示:á>a,à>a,â>a,以此类推;并删除点、连字符等特殊字符。 谢谢!

  • 我想知道如何检查文件是否存在: 例如,我有很多文件: 如何检查以Bob开头的文件是否存在?

  • 我正在尝试解析一些json,这样我就可以得到json的不同部分。当我使用以下代码时 我得到了一个错误: 你知道为什么我会犯这个错误吗?我能够用在线json验证器验证json