Установление зависимости в xslt - PullRequest
1 голос
/ 14 февраля 2011

У меня проблема с установлением зависимости без избыточности в XSLT 1.0. У меня есть тип узла a и тип узла b. a зависит от b - если я сталкиваюсь с a, а b отсутствует, я должен вставить его. Кроме того, я не должен ничего менять в любой другой ситуации.

Введите:

<variables> 
    <var Value="a"/>
</variables>

Выход:

<variables> 
    <var Value="a"/>
    <var Value="b"/>
</variables>

Трудность, с которой я столкнулся, заключается в том, что я не знаю, как искать a и b внутри одного и того же шаблона. Я могу найти a и заменить его на a и b, но затем я обнаружил себя с избыточностью, когда оба были там в первую очередь. Я могу искать a или b и заменить первый экземпляр этого на a и b , но затем, если у меня будет только b , Я буду включать а без желания. Я не знаю, как искать a , а затем, если я его найду, искать узел равноправного уровня b.

1 Ответ

4 голосов
/ 14 февраля 2011

Это преобразование :

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

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "var[@Value='a' and not(../var[@Value='b'])]">

  <xsl:call-template name="identity"/>
    <var Value="b"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу :

<variables>
    <var Value="a"/>
</variables>

создает искомое, правильный результат:

<variables>
   <var Value="a"/>
   <var Value="b"/>
</variables>

Объяснение :

  1. Правило / шаблон идентификации копирует каждый узел "какis ". Использование и переопределение правила идентификации является наиболее фундаментальным и мощным шаблоном проектирования XSLT.

  2. Существует только еще один шаблон - переопределение правила идентификации для любого элемента var, значение атрибута Value которого равно "a", в котором отсутствует элемент var с одним родственным элементом с атрибутом Value со значением "b".Этот шаблон копирует соответствующий элемент, а затем создает новый элемент var, как требуется.

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