我在一个项目中工作,那里给了我一个允许的字符列表,并要求我删除不需要的字符。我已经完成了以下工作,但我觉得它很麻烦,而且超出了应有的范围
<?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-'.,/@&()!+</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,''),'')) > 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
考虑以下简化示例:
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