2016-11-29 4 views
0

Есть в любом случае я могу выбрать узлы только содержит пробелы (  ,   , 	) с помощью XPath ..XPath - выбор узлов содержит только пробелы

вот пример,

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

нужно выбрать первые 3 <p> узлы, которые содержат только пробельные элементы

+0

как насчет пустого узла, такого как '

'? –

+0

@ michael.hor257k, пустой узел, такой как

, не нужно выбирать – sanjay

ответ

1

Обратите внимание, что обычное определение пробелов в XML НЕ включает символ NBSP (xA0).

Чтобы выбрать узлы, которые содержат один или несколько пробельных символов, и ничего другого, где пробельные означает x9, ха, xd, x20 и xA0, вы можете сделать (в XPath 2.0)

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

В качестве альтернативы вы мог бы рассмотреть

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

, который соответствует многим другим пространственноподобным символам, таким, как эм-пространство, ан-пространства, тонкие пространства, волосы пространства, идеографическое пространство и т.д.

+0

Обратите внимание, что '[\ p {Z}]' does ** not ** включает символ горизонтальной вкладки ''. –

+0

Вы узнаете что-то каждый день! –

+0

См. Также: http://stackoverflow.com/a/40927273/3016153 –

-1

Вы можете использовать следующие XPath только выбрать узлы, которые содержат пробелы:

2

Вам необходимо применить translate и проверить длину таких узлов, которая содержит только пробелы.

Demo для вас: 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

Чтобы выбрать 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>