XSLT получает контекстный узел внутри вложенных условий - PullRequest
0 голосов
/ 10 апреля 2020

На самом деле у меня нет действительно вопроса, я просто хочу подтверждение для моего предположения. Я предполагаю, что невозможно получить узел с начала выбора ./attribute внутри вложенных условий в месте, где я написал here you need the current attribute from the start of select, потому что я уже в контексте переменной $oldBaseline. Или есть какой-нибудь способ? Конечно, я могу хранить этот узел внутри переменной, но это всегда возможно ...

    <xsl:variable name="changedMonitorSettings" 
        select="./attribute[($oldBaseline/module/object/object[attribute[@name='Object Text']=$currentObject/attribute[@name='Object Text']]
            /attribute[@name = "here you need the current attribute from the start of select"/@name]) !=.]"/>

Мне нужно добавить еще несколько деталей:
Узел object выглядит следующим образом. Есть много attribute узлов. Я хочу сравнить каждый attribute из одного xml с тем же именем attribute из другого xml.

        <object>
            <attribute name="CM_ABS">CM_NORMAL</attribute>
            <attribute name="CM_AVH">CM_AVH_INHIBIT</attribute>
            <attribute name="CM_BCM">CM_BCM_NORMAL</attribute>
            <attribute name="CM_BHM">CM_BHM_NORMAL</attribute>
            <attribute name="CM_BRAKE_AC">CM_BRAKE_AC_NORMAL</attribute>
            <attribute name="CM_CC">CM_CC_NORMAL</attribute>
            <attribute name="CM_EDTR">CM_EDTR_NORMAL</attribute>
            <attribute name="CM_EYT">CM_EYT_NORMAL</attribute>

Поэтому мне нужно во время обработки xslt для каждого attribute, в указанном месте внутри предиката, attribute, который в настоящее время исследуется на этом этапе обработки. Потому что мне нужно проверить, имеет ли attribute из oldBaseline то же имя, что и attribute, которое в настоящее время используется на этапе обработки. Я думаю, что функция current() не будет работать, потому что она просто возвращает узел object, таким образом, current()/attribute просто возвращает первый attribute узла object.
Таким образом, мне нужно исправить, что Я уже в контексте $oldBaseline это на самом деле не в этом суть, я уже несколько месяцев сталкивался с этой проблемой go ...

Так что вопрос сейчас:
можно получить узел attribute, который в данный момент находится на стадии расследования на текущем этапе обработки?

1 Ответ

0 голосов
/ 11 апреля 2020

XPath 3 имеет выражение let для привязки переменных (например, ./attribute[let $a := . return ($oldBaseline/module/object/object[attribute[@name='Object Text']=$currentObject/attribute[@name='Object Text']]/attribute[@name = $a/@name]) !=.], если мне удастся обработать это длинное выражение, я не проверял, есть ли скобки, необходимые для его структурирования по назначению).

В XPath 2 может быть возможно использовать for .. return вместо let, например, ./attribute[for $a in . return ($oldBaseline/module/object/object[attribute[@name='Object Text']=$currentObject/attribute[@name='Object Text']]/attribute[@name = $a/@name]) !=.].

Перекрестная ссылка / сравнение на основе значения атрибута или элемента также может указывать на то, что ключ, объявленный с xsl:key и использование функции key, могут помочь упростить выражение и повысить производительность поиска.

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