2016-07-18 2 views
0

Я пытаюсь получить имя следующего имени элемента, используя общий Xpath и общий XSL. Но не удалось получить имя элемента.Следующее имя элемента

Input 1:

<test> 
<userId>we</userId> 
<userId1> 
<testy:tool/> 
</userId1> 
</test> 

Input 2:

<test> 
<userId>we</userId> 
<userId1> 
<testy:hammer/> 
</userId1> 
</test> 

Xsl Я использую:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" 
    > 
    <xsl:template match="operationName"> 

     <xsl:value-of select="local-name(/test/userId1)"/> 
     <xsl:apply-templates select="local-name(/test/userId1)" mode="next"/> 

    </xsl:template> 

    <xsl:template match="testy" mode="next"> 
     <xsl:value-of select="(following::testy | descendant::testy)[1]"/> 
    </xsl:template> 

</xsl:stylesheet> 

Но это всегда отображает значение UserID. Может ли кто-нибудь указать, что я делаю неправильно здесь?

Cheers!

+0

Ваших вопрос не совсем понятен. Во-первых, ваш вход недействителен XML. Тогда на вашем входе нет 'operationName' или 'testy', поэтому XSLT ничего не делает. Наконец, неясно, каков ожидаемый результат. –

+0

Результат, который мне нужен, - или на основе входного XML. – Sammy

+0

Ну, путь к нему - '/ test/userId1/*'. –

ответ

2

Ваш XSLT, как представлено, не имеет шаблонов, соответствующих любым входным XML-элементам. Таким образом, он заканчивается использованием default template. По сути, это выводит конкатенацию всех текстовых значений в документе, то есть we.

Я предполагаю, что вы хотите вывести имя следующего (потомок, брат, сестра или другой) элемент, относительно userId1 элемента. Некоторые XSLT, что ближе к тому, что вы, кажется, хотят это:

<xsl:stylesheet 
    xmlns:testy="http://example.testy.com" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/test/userId1" mode="next"/> 
    </xsl:template> 

    <xsl:template match="userId1" mode="next"> 
     <xsl:value-of select="name((following::testy:* | descendant::testy:*)[1])"/> 
    </xsl:template> 

</xsl:stylesheet> 

Чтобы заставить его работать, вам нужно исправить ваш вход будет хорошо сформировано в отношении пространств имен:

<test xmlns:testy="http://example.testy.com"> 
    <userId>we</userId> 
    <userId1> 
    <testy:tool/> 
    </userId1> 
</test> 
+0

Отличный .. Спасибо @LarsH. – Sammy

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