Подтвердить что ты не робот

Как проверить, существует ли атрибут в XML файле, используя XSL

Во время выполнения я могу иметь два формата XML файла:

  • <root>
        <diagram> 
            <graph color= "#ff00ff">    
                <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
                <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
            </graph>  
        </diagram> 
    </root>
    
  • <root>
        <diagram> 
            <graph>    
                <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
                <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
            </graph>  
        </diagram> 
    </root>
    

В зависимости от наличия атрибута цвета я должен обрабатывать значения xaxis и yaxis.

Мне нужно сделать это с помощью XSL. Может кто-нибудь помочь мне в намеке мне фрагмент, где я могу проверить эти условия.

Я попытался использовать

<xsl: when test="graph[1]/@color">
     //some processing here using graph[1]/@color values
</xsl:when>

У меня ошибка...

4b9b3361

Ответ 1

Вот очень простой способ сделать условную обработку, используя полную силу соответствия шаблону XSLT и исключительно "push", и это даже позволяет избежать использования условных инструкций, таких как <xsl:if> или <xsl:choose>:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/root/diagram[graph[1]/@color]">
  Graph[1] has color
 </xsl:template>

 <xsl:template match="/root/diagram[not(graph[1]/@color)]">
  Graph[1] has not color
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему XML-документу:

<root>
    <diagram>
        <graph color= "#ff00ff">
            <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
            <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
        </graph>
        <graph>
            <xaxis>101 102 103 1012 10312 103123 101231 1023 </xaxis>
            <yaxis>101 102 103 1012 10312 103123 101231 1023 </yaxis>
        </graph>
    </diagram>
</root>

требуется, правильный результат получается:

  Graph[1] has color

, когда одно и то же преобразование применяется к этому XML-документу:

<root>
    <diagram>
        <graph>
            <xaxis>101 102 103 1012 10312 103123 101231 1023 </xaxis>
            <yaxis>101 102 103 1012 10312 103123 101231 1023 </yaxis>
        </graph>
        <graph color= "#ff00ff">
            <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
            <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
        </graph>
    </diagram>
</root>

снова получается желаемый и правильный результат:

  Graph[1] has not color

Можно настроить это решение и поместить любой код в первый шаблон и, если необходимо, во второй шаблон.

Ответ 2

Настроить шаблон в одном совпадении как

<xsl:template match="diagram/graph">
  <xsl:choose>
    <xsl:when test="@color">
         Do the Task
    </xsl:when>
    <xsl:otherwise>
         Do the Task
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>**

Ответ 3

<xsl:when test="graph[1]/@color">
     //some processing here using graph[1]/@color values
</xsl:when>

Я собираюсь сделать предположение, потому что ваш вопрос не содержит много важной информации, такой как контекст, в котором появляется <xsl:when.... Если ваш комментарий верен, то вы должны сделать процесс graph[1]/xaxis и .../yaxis, а не graph[1]/@color значения.

Ответ 4

Я не получаю его - кроме небольшого синтаксиса, настраиваемого для использования шаблонов apply:

<xsl:template match="graph[1][@color]">
  <!-- your processing here -->
</xsl:template>

Не так много мы можем сказать вам, не зная, что вы на самом деле хотите сделать.