这里有一个XSLT大师:-)
我必须处理无法控制的Java程序的XML输出。
在这个应用程序输出的文档中,html标签保持为
<u><i><b><em>
等等,而不是
<u><i><b><em> and so on.
这不是一个大问题,我使用XSLT来解决这个问题,但使用normalize空格来删除多余的空白也会删除这些html标记之前的空格。
示例
<Locator Precode="7">
<Text LanguageId="7">The next word is <b>bold</b> and is correctly spaced
around the html tag,
but the sentence has extra whitespace and
line breaks</Text>
</Locator>
如果我运行XSLT脚本,我们使用它来删除多余的空白,这是的相关部分
<xsl:template match="text(.)">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
在结果输出中,xslt正确地删除了额外的空白和换行符,但它也删除了标记之前的空格,从而产生以下输出:-
The next word isboldand is correctly spaced around the html tag, but the sentence has extra whitespace and line breaks.
单词"bold"前后的间距也被去掉了。
有人知道如何防止这种情况发生吗?我已经无计可施了,所以任何帮助都将不胜感激!
:-)
你好,
是的,当然,这是完整的样式表。我们必须处理一次中的html标签和间距
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Text//*">
<xsl:value-of select="concat('<',name(),'>')" />
<xsl:apply-templates />
<xsl:value-of select="concat('</',name(),'>')" />
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)"/>
</xsl:template>
<xsl:template match="Instruction//*">
<xsl:value-of select="concat('<',name(),'>')" />
<xsl:apply-templates />
<xsl:value-of select="concat('</',name(),'>')" />
</xsl:template>
<xsl:template match="Title//*">
<xsl:value-of select="concat('<',name(),'>')" />
<xsl:apply-templates />
<xsl:value-of select="concat('</',name(),'>')" />
</xsl:template>
</xsl:stylesheet>
XSLT1.0解决方案是一个XPath表达式,用于将几个空白字符的序列替换为一个空白字符。这个想法是而不是我自己的,它取自Dimitre Novatchev的回答。
与内置的normalize-space()
函数相比,其优点是保留了尾部空白(在您的情况下,在b
元素之前和之后)。
编辑:作为对您编辑问题的回应。下面是合并到样式表中的XPath表达式。还有:
- 明确表示
omit-xml-declaration="no"
是多余的。这是XSLT处理器执行的默认操作 - 您的几个模板具有相同的内容。我使用
|
将它们总结为一个单独的
样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Text//*|Instruction//*|Title//*">
<xsl:value-of select="concat('<',name(),'>')" />
<xsl:apply-templates />
<xsl:value-of select="concat('</',name(),'>')" />
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select=
"concat(substring(' ', 1 + not(substring(.,1,1)=' ')),
normalize-space(),
substring(' ', 1 + not(substring(., string-length(.)) = ' '))
)
"/>
</xsl:template>
</xsl:stylesheet>
XML输出
<?xml version="1.0" encoding="UTF-8"?>
<Locator Precode="7">
<Text LanguageId="7">The next word is <b>bold</b> and is correctly spaced around the html tag, but the sentence has extra whitespace and line breaks</Text>
</Locator>