Условная стоимость брата - PullRequest
2 голосов
/ 27 января 2011

Мне нужно написать XSLT, чтобы получить значение ближайшего значения словаря для данного узла. Например, моя структура может быть такой:

<rootnode>
 <rootcontainer>
  <dictionary>
   <key1> value /<key1>
  </dictionary>
  <pages>
   <page1>
    <!--xslt goes here-->
   </page1>
    </pages>
 </rootcontainer>
 <dictionary>
  <key1>
   independent value
  </key1>
  <key2>
   value 2
  </key2>
 </dictionary>
</rootnode>

Я хочу создать переменные $key1 и $key2 внутри page1. Значение $key1 будет «значением», а значение $key2 будет «значением 2». Если rootcontainer\dictionary\key1 не существует, значение $key1 будет «независимым значением».

Надеюсь, это имеет смысл.

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Вот компактный способ определения необходимых переменных:

 <xsl:variable name="vKey1" select=
  "(/*/rootcontainer/dictionary/key1
   |
    /*/dictionary/key1
    )
     [1]
  "/>

 <xsl:variable name="vKey2" select=
  "(/*/rootcontainer/dictionary/key2
   |
    /*/dictionary/key2
    )
     [1]
  "/>

При использовании простой таблицы стилей xslt:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vKey1" select=
  "(/*/rootcontainer/dictionary/key1
   |
    /*/dictionary/key1
    )
     [1]
  "/>

 <xsl:variable name="vKey2" select=
  "(/*/rootcontainer/dictionary/key2
   |
    /*/dictionary/key2
    )
     [1]
  "/>

 <xsl:template match="/">
  Key1: <xsl:value-of select="$vKey1"/>
  Key2: <xsl:value-of select="$vKey2"/>
 </xsl:template>
</xsl:stylesheet>

и применяется к предоставленному документу XML (исправлено, так как оно было сильно искажено):

<rootnode>
    <rootcontainer>
        <dictionary>
            <key1> value </key1>
        </dictionary>
        <pages>
            <page1> </page1>
        </pages>
    </rootcontainer>
    <dictionary>
        <key1> independent value </key1>
        <key2> value 2 </key2>
    </dictionary>
</rootnode>

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

  Key1:  value 
  Key2:  value 2 

Объяснение

Выражение:

 (/*/rootcontainer/dictionary/key1
|
 /*/dictionary/key1
 )
  [1]

означает :

Возьмите набор узлов (потенциально) двух элементов, а из них - первый в порядке документа.

Поскольку второй из этих двух элементов появляется позже в порядке документа, он будет первым (и выбранным), только если первое из двух выражений XPath, окружающих оператор объединения (|), не выберет любой элемент.

0 голосов
/ 27 января 2011

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

<xsl:choose>
   <xsl:when test="your test condition">
      <xsl:variable name="key1" select="your value">
   </xsl:when>
   <xsl:otherwise>
      <xsl:variable name="key1" select="your alternative value">
   </xsl:otherwise>
</xsl:choose>

Или более кратко:

 <xsl:variable name="key1" select="if(your test condition) then your value else your alternative value;"/>

Обновление: Спасибо за обновление вопроса. Я сейчас попробую.

<xsl:template match="page1">
<xsl:choose>
   <xsl:when test="../../preceding-sibling:dictionary[1]/key1">
      <xsl:variable name="key1" select="../../preceding-sibling:dictionary[1]/key1">
   </xsl:when>
   <xsl:otherwise>
      <xsl:variable name="key1" select="../../../following-sibling:dictionary[1]/key1">
   </xsl:otherwise>
</xsl:choose>
</xsl:template>

Таким образом, значение $key1 будет узлом <key1> в предыдущем словаре, если он есть, и узлом <key1> в следующем словаре, если его нет. Это правильно?

(Вы также можете использовать структуру if/then/else, если хотите, но я использовал xsl:choose, потому что, вероятно, ее легче читать.)

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