我一直在研究这个XML文件(超过460.000行),以便提取所有内容标记并将它们存储在单独的文本文件中。这个XSLT代码执行并创建了我想要的文件,但是我不明白为什么生成的文本文件充满了空格,即使我在XSLT文件中使用了strip space元素来擦除所有没有用的空格。
这是我的XML文件:
<?xml version="1.0"?>
<sa>
<review>
<product>
<name>
Scary movie
</name>
</product>
<rating>
0.5
</rating>
<content>
bad
</content>
</review>
<review>
<product>
<name>
The Space
</name>
</product>
<rating>
0.5
</rating>
<content>
bad
</content>
</review>
</sa>
这是XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:for-each select="review">
<xsl:if test="rating=0.5">
<xsl:value-of select="ancestor-or-self::*/content"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果是:
bad
bad
为什么2个“内容”标签之间有这个空格?
xsl:strip-space只删除完全由空格组成的文本节点。它不会修剪包含可打印文本的节点中的前导和尾随空格,例如:
<name>
The Space
</name>
为此,通常的方法是normalize-space():
<xsl:value-of select="normalize-space(ancestor-or-self::*/content)"/>
或者不是在每个地方标准化空间上插入调用,您可能希望对具有标识模板规则的文档执行预处理传递以及规则
<xsl:template match="text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
normalize-space()可能比你想做的更多 - 它用一个空格替换内部空格序列(包括换行符)。在XSLT 2.0中,编写自己的trim()函数很容易,它可以做一些不太激进的事情。在XSLT 1.0中,它更难 - 它需要递归命名模板 - 所以这绝对是预处理过程的一部分。