如何解决如何删除xml文本节点中的换行符
比方说,我的XML格式非常糟糕,例如:
<?xml version="1.0" encoding="ISO-8859-1"?>
<tag1>
<tag2>
Some text
</tag2>
<tag3>
Some other text
</tag3>
</tag1>
我必须将其转换为如下形式:
<?xml version="1.0" encoding="ISO-8859-1"?>
<tag1>
<tag2>roman</tag2>
<tag3>Some other text</tag3>
</tag1>
我已经尝试过使用XSLT转换(也有许多变体):
<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
我已经使用this online tool进行验证,但是我总是失败...
您能帮我什么最简单的方法吗?
解决方法
尝试失败的原因是您有两个与文本节点匹配的模板:
- 您的第一个模板仅匹配文本节点;
- 您的第二个模板匹配任何类型的节点-包括文本 节点。
大多数处理器通过应用样式表中的最后一个匹配模板来解决此类冲突(尽管specification允许发信号通知错误)。
简单的解决方案是更改模板的顺序,并希望处理器选择从错误中恢复。
或者,您可以将第一个模板的优先级提高到-0.5以上(身份转换模板的优先级),例如:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="text()" priority="0">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
要获得问题中显示的输出,您还需要添加:
<xsl:output indent="yes"/>
位于样式表的顶层。
,我不知道您使用的是哪种XSLT引擎,但这对我有用:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
</xsl:stylesheet>
产生:
<?xml version="1.0"?><tag1><tag2>Some text</tag2><tag3>Some other text</tag3></tag1>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。