2014-02-05 2 views
0

У меня есть XML, подобный этому:Проверьте родитель имеет текст за пределами своих детей

<parent> 
    <child>child's text</child> 
    <child>other child's text</child> 
    parent's text 
</parent> 

Обратите внимание, что это разрешено иметь несколько элементов ребенка.

Я хотел бы знать, имеет ли родительский элемент текст за пределами его дочерних элементов.

Я пришел к этому решению:

<xsl:if test="normalize-space(parent/child[1]) = normalize-space(parent)"> 
    <xsl:text>No parent text</xsl:text> 
</xsl:if> 

Я использую parent/child[1], потому что функция нормализуют-пространство не принимает последовательность, как это аргумент.

Есть ли лучший способ сделать это?

(я нашел this вопрос по этой теме, но ответ неправильный или вопрос отличается)

ответ

1

Использование text() явно относятся к текстовым узлам.

Лучший способ сделать это:

<xsl:if test="parent/text()[not(parent::child)]"> 
    <!--This parent element has text nodes--> 
</xsl:if> 

Или же, вы могли бы написать отдельный шаблон:

<xsl:template match="text()[parent::parent]"> 
    <xsl:text>parent element with text nodes!</xsl:text> 
</xsl:template> 
+0

родителя/текст() возвращает конкатенацию текста родителя плюс все его детей. – gombost

+0

Извините, не конкатенация. Он возвращает несколько текстовых узлов, содержащих текст узла и его дочерние элементы. Поэтому он не работает с нормализованным пространством в моем решении. – gombost

1

Этот шаблон:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
<xsl:strip-space elements="*"/>  
    <xsl:template match="/"> 
     <xsl:choose> 
      <xsl:when test="parent/child::text()"> 
       true 
      </xsl:when> 
      <xsl:otherwise>false</xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

при нанесении на ваш input XML, возвращает

true 

при нанесении на следующий XML:

<?xml version="1.0" encoding="UTF-8"?> 
<parent> 
    <child>child's text</child> 
    <child>other child's text</child> 
</parent> 

возвращает

false 
Смежные вопросы