【问题标题】:XPath - select nodes only contains whitespacesXPath - 选择节点仅包含空格
【发布时间】:2016-11-29 05:38:09
【问题描述】:

我是否可以使用 xpath 选择仅包含空格 (  ,   , 	) 的节点..

这是一个例子,

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

我需要选择仅包含空白元素的前 3 个 &lt;p&gt; 节点

【问题讨论】:

  • &lt;p/&gt;这样的空节点呢?
  • @michael.hor257k,

    等空节点不需要选择

标签: xslt xpath xslt-2.0


【解决方案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、表意空间等。

【讨论】:

  • 请注意,[\p{Z}]包含&amp;#x9;水平制表符。
【解决方案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>

【讨论】:

    【解决方案3】:

    要选择不为空但仅包含空格字符的p 节点,请使用:

    /doc/p[string() and not(normalize-space())]
    

    例如,下面的样式表:

    XSLT 1.0

    <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>
    

    当应用于以下示例输入时:

    XML

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

    将返回:

    结果

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多