Как проверить, существует ли атрибут в файле XML с использованием XSL - PullRequest
27 голосов
/ 10 ноября 2010

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

  1. <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>
    
  2. <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>
    

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

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

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

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

Я получил ошибку ...

Ответы [ 4 ]

32 голосов
/ 11 ноября 2010

Вот очень простой способ выполнить условную обработку с использованием полной мощности сопоставления с шаблоном 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

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

17 голосов
/ 20 ноября 2010

Настройте шаблон в одном матче, как это

<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>**
4 голосов
/ 11 ноября 2010
<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 значения.

1 голос
/ 10 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...