用html标签规范化空间问题



这里有一个XSLT大师:-)

我必须处理无法控制的Java程序的XML输出。

在这个应用程序输出的文档中,html标签保持为

<u><i><b><em>  

等等,而不是

&lt;u&gt;&lt;i&gt;&lt;b&gt;&lt;em&gt; 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('&lt;',name(),'&gt;')" />
  <xsl:apply-templates />
  <xsl:value-of select="concat('&lt;/',name(),'&gt;')" />
</xsl:template>
<xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)"/>
</xsl:template>

<xsl:template match="Instruction//*">
  <xsl:value-of select="concat('&lt;',name(),'&gt;')" />
  <xsl:apply-templates />
  <xsl:value-of select="concat('&lt;/',name(),'&gt;')" />
</xsl:template>
<xsl:template match="Title//*">
  <xsl:value-of select="concat('&lt;',name(),'&gt;')" />
  <xsl:apply-templates />
  <xsl:value-of select="concat('&lt;/',name(),'&gt;')" />
</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('&lt;',name(),'&gt;')" />
  <xsl:apply-templates />
  <xsl:value-of select="concat('&lt;/',name(),'&gt;')" />
</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 &lt;b&gt;bold&lt;/b&gt; and is correctly spaced around the html tag, but the sentence has extra whitespace and line breaks</Text>
</Locator>

相关内容

  • 没有找到相关文章

最新更新