删除文本节点XSLT </p>中<p>标记后的空格

时间:2012-07-03 09:18:34

标签: xslt xslt-2.0 space

我目前有一个正在使用的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>

有人可以帮我解决这个问题吗?

由于

5 个答案:

答案 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. 获取此字符前面的空格字符串(在1中获得。)。

  3. 获取紧跟在该空格字符串后面的字符串(在2中获得。)。


  4. <强> 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&#9;&#10;&#13;]+(.+)$', '$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/