Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Как проверить наличие тэга в xml используя xsl


Автор: serg313 31.10.2011, 15:08
У меня два вопроса к уважаемым спецам по xsl. Есть приблизительно следующий xml
Код

<roottag>
      <tag1>qqqq</tag1>
      <tag2 xsi:type="aaaaaa">
         <tag3>bbb</tag3>
         <tag4>ccc</tag4>
         <tag5>ddd</tag5>
      </tag2>
         <tag2 xsi:type="bbbbb">
          <tag3>kkk</tag3>
          <tag5>lll</tag5>
      </tag2>
</roottag>

Вопрос первый: Как получить значение атрибута xsi:type в тэге tag2.
Я пишу
Код

    <xsl:template match="tag2">
        <td>
            <xsl:value-of select="@xsi:type"/>
        </td>
      
        <xsl:apply-templates/>
    </xsl:template>

Но получаю ошибку: пространство имен xsi не декларировано.

И второй вопрос. Как из tag5 узнать присутствует ли tag4(его может не быть).
Я пишу:
Код


    <xsl:template match="tag5">
        <xsl:if test="/roottag/tag2/tag4 = true()">
            <td>0</td>
        </xsl:if>
       
            
    </xsl:template>


Но это не работает правильно.
Заранее спасибо.

Автор: Egik2 31.10.2011, 16:11
Вот пример xslt кода который реализует это

Код

<?xml version="1.0" encoding="UTF-8" ?>

<!-- New document created with EditiX at Mon Oct 31 15:43:45 MSK 2011 -->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>

    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="/">
        
        <GET_ATTR>
            <xsl:value-of select="/roottag/tag2/@xsi:type"/>
        </GET_ATTR>
        
        <CHECK>
            <xsl:if test="/roottag/tag2/tag6">
                <EXISTS>1</EXISTS>
            </xsl:if>
        </CHECK>
    </xsl:template>
    
    

</xsl:stylesheet>






Необходимо было добавить xmlns:xsi="http://www.w3.org/TR/html4/" и в XML и в XSLT файл


Код

<?xml version="1.0" encoding="UTF-8"?>
<roottag xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
      <tag1>qqqq</tag1>
      <tag2 xsi:type="aaaaaa">
         <tag3>bbb</tag3>
         <tag4>ccc</tag4>
         <tag5>ddd</tag5>
      </tag2>
         <tag2 xsi:type="bbbbb">
          <tag3>kkk</tag3>
          <tag5>lll</tag5>
      </tag2>
</roottag>


Автор: serg313 31.10.2011, 17:07
Уважаемый Egik2 спасибо, первая проблема решилась, я забыл правильно добавить пространство имен в xsl файл. 
Но вот вторая проблема к сожалению не решилась, приведенный Вами код действительно определяет наличие тэга, но в принципе есть он или нет, другими словами, в моем случае всегда условие
Код

 <xsl:if test="/roottag/tag2/tag4">

будет давать true, т.к. tag4 в принципе есть, но мне нужно при заходе в tag2 определить есть ли у данного tag2(т.е. у того, который в данный момент анализируется) подчиненный tag4 или нет 

Автор: magelan 1.11.2011, 10:23
смешная проблема...

Код

<xsl:template match="tag2">
     <xsl:if test="tag4">
          <!-- Есть ребенок tag4 -->
     </xsl:if>
     <xsl:if test=".//tag4">
          <!-- Есть ребенок или внучка или правнучек tag4 (любой потомок), дорогая операция поиска -->
     </xsl:if>
</xsl:template>


да, чуть не забыл, из таг 5
Код

<xsl:template match="tag5">
     <xsl:if test="preceding-sibling::tag4 | following-sibling::tag4">
          <!-- Смотрим в обе стороны уровня в поисках tag4 -->
     </xsl:if>
</xsl:template>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)