XSLT: проверить, существует ли узел, независимо от того, является ли он дочерним элементом или внуком текущего узла - PullRequest
1 голос
/ 11 мая 2011

Я работаю над некоторыми преобразованиями xslt, и я только что обнаружил, что может быть или не быть дополнительного узла между моим текущим родителем и его детьми, в зависимости от внешних факторов.Поэтому теперь я должен изменить свой код xslt, чтобы иметь дело с обоими этими сценариями:

сценарий 1:

<parent>
   <child/>
   <child/>
<parent>

сценарий 2:

<parent>
   <nuisance>
      <child/>
      <child/>
   </nuisance>
<parent>

Iесть ситуации, в которых я test="parent/child" или иным образом использую этот формат доступа к родителю / узлу.

Мне нужно что-то вроде test="parent/magic(* or none)/child"

Они могут решить эту проблему только так, как я знаю:

<xsl:choose>
    <xsl:when test="parent/child">
       <!-- select="parent/child"-->            
    </xsl:when>

    <xsl:otherwise>
       <!-- select="parent/*/child"-->      
    </xsl:otherwise>
</xsl:choose>

Но это утроит мой код вразмер и будет много ручного труда ...

Помощь высоко ценится!

Ответы [ 2 ]

5 голосов
/ 11 мая 2011

Почему бы просто не выбрать объединение двух?

<xsl:apply-templates select="parent/child|parent/*/child"/>

Это выберет правильные узлы в обоих случаях.

0 голосов
/ 12 мая 2011

У меня есть ситуации, в которых я test="parent/child" или иным образом использовать этот формат доступа к родитель / узел.

Мне нужно что-то вроде test="parent/magic(* or none)/child"

Это выражение может быть быстрее :

parent/child or parent/*/child

, чем выражение :

parent/child|parent/*/child

Почти любой движок XPath немедленно останавливает оценку при первом появлении parent/child или при первом появлении parent/someElement/child

С другой стороны, второе выражение выбирает объединение всех элементов parent/child и parent/*/child, и таких элементов может быть много.

Еще хуже :

<xsl:apply-templates select="parent/child|parent/*/child"/>        

Тест, как и требует исходный вопрос, сильно отличается от применения шаблонов ко всем узлам, которые соответствуют этому тесту. Просто проверка состояния может быть значительно более эффективной. ОП никоим образом не указал, что тест каким-либо образом связан с применением шаблонов.

...