如何处理从XML和XSLT文件生成的文本文件中的空格?

问题描述 投票:0回答:1

我一直在研究这个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个“内容”标签之间有这个空格?

xml xslt whitespace transformation
1个回答
1
投票

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中,它更难 - 它需要递归命名模板 - 所以这绝对是预处理过程的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.