我想在里面提取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之前删除空格。 因为这是我的结果
你可以帮帮我吗?答案 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>
关键修复:
normalize-space()
来修剪CDATA文本中的空格。这消除了前导和尾随空格,产生了解析为有效XML的输出
注意:这也会将CDATA文本中的所有换行符转换为单个空白字符。因此,如果换行符对您很重要,则此方法无效。