2013-09-20 3 views
1

Я просмотрел много примеров здесь, на SO, но я не смог найти именно то, что искал. Существует множество примеров для соответствия элементу, имеющему определенный родительский элемент. Тем не менее, я не хочу сопоставлять определенного родителя, я просто хочу знать, имеет ли он родителя вообще.XSLT: проверьте, имеет ли элемент XML родительский элемент в xpath

Так что для XML здесь:

<foo> 
    <bar/> 
</foo> 
<bar/> 

со следующим XSLT:

<xsl:template match="bar"> 
    <xsl:choose> 
     <xsl:when test="[test here]"> 
      ..do something.. 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

как я просто проверить, если <bar> элемент имеет родителя или не имеет ни одного?

Спасибо!

+0

Стандартный формат XPath будет выбором для 'ancestor :: *', который вы можете легко найти, если вы посмотрите на учебники XSLT/XPath, касающиеся родителей и предков. Я предполагаю, что вы впервые задумались об этом, и никто из них не работал, так что: что вы пробовали, что не работает? –

+0

Возможно, я не понимаю ваш вопрос, но, за исключением корня, не все ли элементы имеют родителя? –

+0

Все элементы имеют родительский элемент, кроме корня. Ваш образец XML недействителен, так как он имеет два корня: 'foo' и' bar'. Это не допускается в хорошо сформированном XML. –

ответ

2

Этот вход:

<foo> 
    <bar> 
    <baz/> 
    </bar> 
</foo> 

Для этого сценария:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text"/> 

    <xsl:template match="*"> 

    <xsl:choose> 
     <xsl:when test="parent::*">Parent: </xsl:when> 
     <xsl:otherwise>No Parent: </xsl:otherwise> 
    </xsl:choose> 
    <xsl:value-of select="name()"/> 
    <xsl:text>&#xa;</xsl:text> 

    <xsl:apply-templates select="*"/> 

    </xsl:template> 

</xsl:stylesheet> 

Урожайность этот выход:

No Parent: foo 
Parent: bar 
Parent: baz 

Примечание. Ваш образец входного файла не является корректным и не может служить в качестве входа для преобразования XSLT, поскольку он имеет два корня.

+1

Да, вы правы - я допустил ошибку. У меня два корневых элемента. Мое намерение состояло в том, чтобы показать, что у меня есть элемент 'bar', который иногда появляется в разных иерархиях в XML. – Zack

2

Просто используйте тест подстановочные имя на родительской оси: test="parent::*"

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