我目前有一个正在使用的XML Feed,在其中我有一个节点,其中包含一堆带有<p>
标签的文本。然而,在每个标签之后,似乎存在导致问题的空间。示例XML文档如下:
<Text>
<p> Sample Text.</p> <p> Sample Text..</p> <p> Sample Text.</p> <p> Sample Text.</p> <p> Sample Text.</p>
</Text>
我想通过删除每个<p>
标记开头的空格,将“text”节点中的数据转换为如下所示。
<Text>
<p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:2)
<强>予。非递归XSLT 1.0解决方案,用于删除任意数量连续空格的起始组:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p/text()">
<xsl:value-of select=
"substring-after
(.,
substring-before
(.,
substring
(translate(., ' ', ''), 1, 1)
)
)"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时:
<Text>
<p> Sample Text.</p> <p> Sample Text..</p> <p> Sample Text.</p> <p> Sample Text.</p> <p> Sample Text.</p>
</Text>
产生了想要的正确结果:
<Text>
<p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
<强>解释强>:
这个想法是:
获取第一个非空格字符。
获取此字符前面的空格字符串(在1中获得。)。
获取紧跟在该空格字符串后面的字符串(在2中获得。)。
<强> II。 XSLT 2.0解决方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p/text()">
<xsl:sequence select="replace(., '^\s+(.+)$', '$1')"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于同一XML文档(上图)时,会产生相同的正确结果:
<Text>
<p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
请注意:
Martin Honnen建议使用:
replace(., '^\s+', '')
虽然这比以下时间短:
replace(., '^\s+(.+)$', '$1')
后者效率更高,因为它只进行一次替换,而前者通常会进行多次替换。
更新:在他写的评论中,OP无法使用XSLT 2.0解决方案:
我现在认为看似空间的东西实际上可能是一个 选项卡,我将如何检查并删除它?
解决方案就是使用:
replace(., '^[\s	 ]+(.+)$', '$1')
答案 1 :(得分:1)
使用身份转换模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
加上p
元素的第一个孩子的模板
<xsl:template match="p/text()[1]">
<xsl:value-of select="substring(., 2)"/>
</xsl:template>
答案 2 :(得分:0)
尝试以下XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
</xsl:stylesheet>
答案 3 :(得分:0)
此模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Text/p/text()[1]">
<xsl:call-template name="ltrim" />
</xsl:template>
<xsl:template name="ltrim">
<xsl:param name="start" select="1" />
<xsl:choose>
<xsl:when test="substring(., $start, 1) = ' '">
<xsl:call-template name="ltrim">
<xsl:with-param name="start" select="$start + 1" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring(., $start)" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
左边修剪<p>
标记内容开头的任何空格。
它只留下所有其他空白。对于您的XML,它返回:
<Text>
<p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
答案 4 :(得分:-1)
使用简单搜索 - 替换实用程序:http://www.rjlsoftware.com/software/utility/search/