2015-11-24 3 views
0

я получил следующий XMLКак получить родительский узел и все его дочерний узел, если условие истинно

<?xml version="1.0" encoding="utf-8"?> 
<Students> 
    <Student> 
     <StdId value="1"/> 
     <Name>a</Name> 
     <Courses> 
      <Course value="c1"/> 
      <Course value="c2"/> 
      <Course value="c3"/> 
     </Courses> 
    </Student> 
    <Student> 
     <StdId value="2" InActive="True"/> 
     <Name>b</Name> 
     <Courses> 
      <Course value="c1"/> 
      <Course value="c4"/> 
      <Course value="c6"/> 
     </Courses> 
    </Student> 
</Students> 

и мой XSLT код

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <xsl:result-document method="xml" href="file:///C:/Student_details.xml"> 
      <xsl:for-each select="Students/Student"> 
       <xsl:if test="(StdId[@InActive != 'True'])"> 
        <xsl:copy-of select="Student"/> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:result-document> 
    </xsl:template> 
</xsl:stylesheet> 

Я хочу, чтобы получить Student элемент с его дочерними узлами, кроме того, где StdIdInActive="True". Мой код не копирует элемент студента.

ответ

1

Вы можете изменить XPath в вашем for-each выбрать только перебирать те, которые не имеют атрибут InActive = "True" вроде этого:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <xsl:result-document method="xml"> 
      <xsl:for-each select="Students/Student[not(StdId/@InActive)]"> 
        <xsl:copy-of select="."/> 
      </xsl:for-each> 
     </xsl:result-document> 
    </xsl:template> 
</xsl:stylesheet> 

Обратите внимание, что ваш вывод не является допустимым XML, поскольку он не имеет корневой узел.

В качестве альтернативы, вы можете использовать шаблон согласования, например:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="Student[not(StdId/@InActive)]"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
    <xsl:template match="/"> 
     <xsl:result-document method="xml"> 
      <root> 
       <xsl:apply-templates/> 
      </root> 
     </xsl:result-document> 
    </xsl:template> 
</xsl:stylesheet> 

В моей второй таблицы стилей, я добавил корневой узел - это для моего собственного локального тестирования, YMMV.

Я также редактировал XPath в своей первой таблице стилей, так как вы сказали в комментарии, что атрибут будет присутствовать только тогда, когда он имеет значение «True».

+0

Спасибо, что сработал. – user3202862

+0

есть ли способ, которым я мог бы игнорировать пространство имен, если корневой элемент не должен писать элемент Student. также как я могу написать и корневой элемент. – user3202862

+0

@ user3202862 - мой второй XSLT показывает корневой элемент 'root'. Я не знаю, каковы ваши требования для корневого элемента, но это относительно просто. Однако вопрос с пространством имен может быть довольно сложным - может быть, лучше сделать для него отдельный вопрос и включить образец XML, на котором есть пространство имён. –

1
  1. Если atributte вообще не существует, узел не будет найден.

    <StdId value="1" InActive="False"/>

будет найдено.

Вы можете использовать

<xsl:if test="(StdId[@InActive!= 'True'] or StdId[not(@InActive)])"> 

, чтобы ALSE выбрать узлы, для которых атрибут не существует.

  1. <xsl:copy-of select="Student" /> не работает. Вы можете использовать
    <xsl:copy-of select="node()" /> для выбора текущего узла (который был бы только содержание узла Student), или <xsl:copy-of select="../Student" /> для того, чтобы также получить <Student> ... </Student> тегов.
+0

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

+1

yap, поэтому я рекомендовал использовать StdId [not (@InActive)] будет выберите узлы, у которых нет атрибута. – Laura

+0

Спасибо. Как получить корневой элемент. – user3202862

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