将XML转换为纯文本 – 我应该如何忽略/处理XSLT中的空格?

前端之家收集整理的这篇文章主要介绍了将XML转换为纯文本 – 我应该如何忽略/处理XSLT中的空格?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将XML文件转换为dokuwiki使用的标记,使用XSLT。这实际上在一定程度上工作,但是XSL文件中的缩进正被插入到结果中。目前,我有两个选择:完全放弃这个XSLT的东西,并找到另一种方式从XML转换为dokuwiki标记,或从XSL文件删除大约95%的空格,使它几乎不可读和维护噩梦。

有没有一些方法来保持缩进在XSL文件,而不是将所有的空格传递到最终文档?

背景:我将一个autodoc工具从静态HTML页面迁移到dokuwiki,所以当应用程序团队运行到不良的代码时,服务器团队开发的API可以由应用程序团队进一步记录。逻辑是为每个页面的一部分留出一个自动工具,并允许注释此块之外的任何地方。我使用XSLT,因为我们已经有XSL文件从XML转换为XHTML,我假设它将更快地重写XSL,而不是从头开始我自己的解决方案。

编辑:啊,对,愚弄我,我忽略了缩进属性。 (其他背景说明:我是XSLT的新手。)另一方面,我还是要处理换行符。 Dokuwiki使用管道来区分表列,这意味着表行中的所有数据必须在一行上。有没有办法抑制换行符输出(只是偶尔),所以我可以做一些相当复杂的逻辑为每个表单元格在一个有点可读的fasion?

在XSLT转换结果中获得不需要的空格有三个原因:

>来自源文档中的节点之间的空格
>来自源文档中的节点的空格
>来自样式表的空格

我将谈论所有三个,因为它可能很难说出空白来自哪里,所以你可能需要使用几种策略。

要处理源文档中节点之间的空格,应使用< xsl:strip-space>以去除出现在两个节点之间的任何空格,然后使用< xsl:preserve-space>以保留可能在混合内容中出现的重要空格。例如,如果您的源文档看起来像:

<ul>
  <li>This is an <strong>important</strong> <em>point</em></li>
</ul>

那么您将要忽略< ul>之间的空格。和< li>以及< / li>和< / ul&gt ;,这不是重要的,但保留< strong>和< em>元素,这是重要的(否则你会得到“这是一个**重要的***点*”)。要做到这一点使用

<xsl:strip-space elements="*" />
<xsl:preserve-space elements="li" />

< xsl:preserve-space>上的元素属性应该基本上列出文档中具有混合内容的所有元素。

Aside: using <xsl:strip-space> also reduces the size of the source tree in memory,and makes your stylesheet more efficient,so it’s worth doing even if you don’t have whitespace problems of this sort.

要处理源文档中节点中出现的空格,您应该使用normalize-space()。例如,如果您有:

<dt>
  a definition
</dt>

并且您可以确保< dt>元素将不会持有任何你想做的事情的元素,那么你可以做:

<xsl:template match="dt">
  ...
  <xsl:value-of select="normalize-space(.)" />
  ...
</xsl:template>

前导和尾随空格将从< dt>值的值中去除。元素,你会得到字符串“一个定义”。

要处理来自样式表的空白,这可能是你遇到的,是当你有一个模板中的文本如下:

<xsl:template match="name">
  Name:
  <xsl:value-of select="." />
</xsl:template>

XSLT样式表以与它们处理的源文档相同的方式解析,因此上述XSLT被解释为保存< xsl:template>元素,其第一个子元素是文本节点并且其第二个子元素是< xsl:value-of>元素与select属性。文本节点具有前导和尾随空格(包括换行符);因为它是样式表中的文本文本,它会逐字地复制到结果中,并带有所有前导和尾随空格。

但是XSLT样式表中的一些空格会自动剥离,即节点之间的空白。您的结果中没有换行符,因为< xsl:value-of>以及< xsl:template>的关闭

要仅在结果中获取所需的文本,请使用< xsl:text>元素像这样:

<xsl:template match="name">
  <xsl:text>Name: </xsl:text>
  <xsl:value-of select="." />
</xsl:template>

XSLT处理器将忽略出现在节点之间的换行符和缩进,并且只输出< xsl:text>元件。

猜你在找的XML相关文章