как использовать два условия в условиях выбора в xslt при использовании шаблона Apply - PullRequest
0 голосов
/ 24 октября 2011
<xsl:apply-templates mode="block2sequence" select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1] and NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][position()=1]"/>

почему я не могу использовать два условия в вышеприведенных условиях, может ли кто-нибудь предложить мне

Ответы [ 2 ]

4 голосов
/ 24 октября 2011
<xsl:apply-templates mode="block2" 
     select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1] "/>

почему я не могу использовать два условия в вышеуказанном условии выбора

Полагаю, это означает ", почему нельзя указывать два условия в одном и том же предикате? "

Ответ таков: выражение :

NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId and position() = 1]

совсем не эквивалентно 1-му выражению выше .

Первое выражение выбирает первого Table дочернего элемента NewDataSet так, что строковое значение его CTD_CTD_PKG_ID дочернего элемента равно строковому значению $PackageId. В этом случае мы не знаем, какой дочерний элемент (в какой позиции) будет выбран из NewDataSet - будет выбран любой дочерний элемент, который окажется первым с указанными свойствами.

С другой стороны, последнее выражение выбирает первого Table дочернего элемента NewDataSet , только если строковое значение его CTD_CTD_PKG_ID дочернего элемента равно строковому значению $PackageId. В этом случае, если что-то выбрано, это будет первый Table дочерний элемент.

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

NewDataSet/Table
      [CTD_CTD_PKG_ID =$PackageId 
     and 
       not(preceding-sibling::Table[CTD_CTD_PKG_ID =$PackageId ])
      ]

Обновление : ОП опубликовал фрагмент кода:

 <xsl:apply-templates mode="block2sequence" select=
    "NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1]
    and
     NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][position()=1]"/>

Этот код вызовет ошибку, выданную во время компиляции процессором XSLT .

Значением атрибута select является логическое значение (expr1 и expr2), однако шаблоны в XSLT 1.0 и XSLT 2.0 можно применять только к узлам. Логическое значение не является узлом - следовательно, ошибка.

Решение :

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

 <xsl:apply-templates mode="block2sequence" select=
    "NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][1]
    |
     NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][1]"/>

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

 <xsl:apply-templates mode="block2sequence" select=
    "(NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId]
    |
     NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType]
     )
      [1]
"/>

Примечания

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

  2. Знаете ли вы, что [1] эквивалентно [position()=1] и короче?

1 голос
/ 24 октября 2011

Вы можете использовать два условия, и ваше выражение выглядит совершенно правильно. Если это не удается с ошибкой, пожалуйста, сообщите нам об ошибке. Если он не выбирает то, что вы хотите, то (а) покажите нам ваш исходный документ и (б) сообщите нам, что вы хотите выбрать.

(Вы знаете, ваш вопрос дает так мало информации, что у вас не создается впечатление, что вы действительно хотите получить ответ.)

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