XLST删除空格 - XML CDATA

时间:2017-05-15 19:59:04

标签: xslt

我想在里面提取XML。 我试过这个XSL,但我需要在

之前删除空格
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://sertex.com/Consult"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" />
 <xsl:template match="/">              
             <xsl:value-of select="//ns:Input/text()" disable-output-
    escaping="yes" />          
             </xsl:template>
     </xsl:stylesheet>

如何在XML Head之前删除空格。 因为这是我的结果

你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

首先,理解问题是值得的,即输入XML的<ns0:Input>元素的内容在CDATA部分之前包含空格。 XSLT会自动删除一些空格,但是这个特定的空格不符合要求,即使操作XSLT空白剥离参数也无法限定,因为空格剥离仅适用于仅空白文本节点。在执行分析之前合并相邻的文本节点,因此即使您认为CDATA部分最初被解析为单独的文本节点,空白位于CDATA部分之外的事实也不会改变任何内容。

可以理解的是,要从输出中省略任何前导空格,因为在输出XML声明之前没有任何空格。另一个答案提供了normalize-space()作为一种方法来做到这一点,但它具有比领先的空白更广泛的效果。如果你想保留除前导空格之外的所有空格,那么你需要付出更多的努力。例如:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://sertex.com/Consult"
    version="1.0">

  <xsl:output method="xml" omit-xml-declaration="yes" />

  <xsl:template match="/">              
    <xsl:variable name="embedded-text"
        select="//ns:Input/text()"/>
    <xsl:variable name="first-non-ws"
        select="substring(normalize-space($embedded-text), 1, 1)"/>
    <xsl:variable name="leading-ws-count"
        select="string-length(substring-before($embedded-text, $first-non-ws))"/>
    <xsl:value-of select="substring($embedded-text, $leading-ws-count + 1)"
        disable-output-escaping="yes" />          
  </xsl:template>

</xsl:stylesheet>

话虽如此,我觉得有必要补充说,结果输出中XML声明中指定的编码与UTF-8和UTF-16不同,并且未在{{1}中指定,这是非常值得怀疑的。 } element作为要使用的编码。这会在输出文档的声明和实际编码之间创建保证不匹配。如果XSLT处理器恰好使用UTF-8而不是UTF-16,那么嵌入式XML可以使用UTF-8中相同编码的字符和嵌入式XML声明指定的编码(ISO-8859-1)来缓解这种情况。 )。请注意,XSLT处理器也允许选择UTF-16,在这种情况下你就是吐司。

答案 1 :(得分:0)

以下是XSL代码的固定版本。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://sertex.com/Consult"
    version="1.0">
    <xsl:output method="xml" omit-xml-declaration="yes" />
    <xsl:template match="/">
        <xsl:value-of select="normalize-space(//ns0:Input/text())" disable-output-escaping="yes" />
    </xsl:template>
</xsl:stylesheet>

关键修复:

  1. 我更改了命名空间以匹配输入XML的命名空间。这可以确保XSL中的模板实际匹配输入XML中的元素。
  2. 我添加了normalize-space()来修剪CDATA文本中的空格。这消除了前导和尾随空格,产生了解析为有效XML的输出 注意:这也会将CDATA文本中的所有换行符转换为单个空白字符。因此,如果换行符对您很重要,则此方法无效。