<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]
эквивалентно [position()=1]
и короче?