2014-12-22 4 views
0

У меня есть следующий XML.получить значение на основе следующего узла

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<new> 
This is content <star.page>21</star.page> with star pages <star.page>22</star.page> inside it. 
</new> 
<main> 
    This is main content 
</main> 
</root> 

Здесь я хочу, чтобы напечатать номер которого следующее main, т.е. нужно напечатать только 22 но нет 21.

Я не хочу, чтобы это было сделано из star.page шаблона. как здесь, 21 следует 22 (оба являются star.page), я хочу напечатать star.page значение, где есть main, следующее за этим, и нет другого star.page между ними. здесь на моем входе между 21 и main есть еще star.page, но не между 22 и main. поэтому я хочу напечатать 22, но не 21. и этот шаблон должен быть сделан внутри template match="star.page", но не с root.

, пожалуйста, дайте мне знать, где я ошибаюсь и как это исправить.

Demo

+0

Пожалуйста, включите соответствующий код (только) и желаемый результат в ваш вопрос. – usr2564301

+0

Предоставьте такой ввод или проверку с этими случаями и сообщите нам об этом. –

+0

@RudramuniTP, это образец, который я предоставил из своего кода. Можете ли вы изменить мое 'if', чтобы соответствовать моему требованию – user3872094

ответ

1

Try это:

XML:

<root> 
<new> 
This is content <star.page>21</star.page> with star pages <star.page>22</star.page> inside it. 
</new> 
<main> 
    This is main content 
</main> 

</root> 

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="star.page"> 
     <xsl:if test="following::*[name()='main'] and not(following::*[name()='star.page'])"> 
      <xsl:text>Last page is </xsl:text><xsl:value-of select="."/> 
     </xsl:if> 
</xsl:template> 

<xsl:template match="*[not(name()='star.page')]/text()"/> 

</xsl:stylesheet> 

Выход:

Last page is 22 
+0

Спасибо за решение, но есть еще больше star.page, вы хотите попробовать его, получите номер страницы, где main следует за звездочкой, а не с какой-либо другой звездой.страница между – user3872094

+0

Здесь в примере есть только 2 номера страниц и на основе xslt, он печатает только последнюю 'star.page', но в моем XML есть' star.page' внутри 'main' также, я хочу напечатайте только последнюю 'star.page', чье следующее' main', и хотите, чтобы оно использовалось с помощью шаблона star.page. – user3872094

+0

Я имею в виду, что я могу сопоставить 'star.page' и видеть' follow :: main' – user3872094

0

Один из способов будет заключаться в использовании preceding при переходе от main и найти последнюю star.page, независимо от остальной части структуры:

<xsl:value-of select="(/root/main/preceding::star.page)[position()=last()]"/> 

Fiddle

+0

Спасибо за решение, но есть еще больше «star.page», вы хотите попробовать: «получите номер страницы, где main следует за звездочкой, а не с любой другой star.page между« – user3872094

+1

Можете ли вы обновите свой пример, чтобы показать пример того, что вы имеете в виду? Это (и ваша скрипка), похоже, соответствуют критериям «напечатайте номер, следующий из которых является основным, то есть хотите напечатать только 22, но не 21.» – StuartLC

+0

Здесь в примере есть всего 2 номера страниц и на основе xslt, он печатает только последний 'star.page', но в моем XML есть' star.page' внутри 'main' также, я хочу напечатать только последнюю' star.page', чье следующее 'main', и хотите, чтобы это сделало, используя 'star.page template' – user3872094

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