XPath - 选择节点仅包含空格

时间:2016-11-29 05:38:10

标签: xslt xpath xslt-2.0

无论如何我可以使用xpath选择仅包含空格(  ,   , 	)的节点。

这是一个例子,

<doc>
    <p> </p>
    <p>   </p>
    <p>         </p>
    <p>text</p>
    <p> text</p>
    <p> text</p>
</doc>

我需要选择仅包含空白元素的前3个<p>节点

4 个答案:

答案 0 :(得分:2)

您需要应用translate并检查仅包含空格的此类节点的长度。

为您演示:http://xsltransform.net/ejivdHb/22

所以,试试

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://locomotive/bypass/docx" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="node()">
    <xsl:copy>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="p">
       <!-- Select only node with white spaces -->
       <xsl:if test="string-length(translate(., ' &#9;&#xA;&#xD;','')) = 0">
          <xsl:copy-of select="." />      
       </xsl:if>

</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

要选择非空的/doc/p[string() and not(normalize-space())] 个节点,但只包含空格字符,请使用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/doc">
    <xsl:copy>
        <xsl:copy-of select="p[string() and not(normalize-space())]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

例如,以下样式表:

XSLT 1.0

<doc>
    <p/>
    <p> </p>
    <p>   </p>
    <p>         </p>
    <p>text</p>
    <p> text</p>
    <p> text</p>
</doc>

应用于以下示例输入时:

<强> XML

<?xml version="1.0" encoding="UTF-8"?>
<doc>
   <p> </p>
   <p>   </p>
   <p>         </p>
</doc>

将返回:

<强>结果

<ul>
  {{#each items}}
  <li>{{agree_button}}</li>
  {{/each}}
</ul>

答案 2 :(得分:1)

请注意,空格的普通XML定义不包括NBSP字符(xA0)。

要选择包含一个或多个空格字符的节点,而没有其他任何内容,其中空格意味着x9,xa,xd,x20和xa0,您可以这样做(在XPath 2.0中)

select="//*[matches(., '[&#x9;&#xa;&#xd; &#xa0;]+')]"

或者你可以考虑

select="//*[matches(., '[\p{Z}]+')]"

匹配许多其他类似空间的字符,如em-space,en-space,thin-space,hair-space,表意空间等。

答案 3 :(得分:-1)

您可以使用以下xpath仅选择包含空格的节点:

//*[normalize-space(text())='']