Как работает область в XSLT, если элементы - PullRequest
0 голосов
/ 28 мая 2018

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

<xsl:if test="s0:PRILoop1/s0:PRI/s0:C509/C50901='AAB'">
                  <UnitPrice>
                    <xsl:value-of select="../C50902"/>
                  </UnitPrice>
                </xsl:if>

Если C50901 = 'AAB', то следует вставить значение в C50902в цену за единицу.Я предполагаю, что после элемента if мне нужно вернуться на один уровень назад, а затем вниз к элементу-родителю, чтобы выбрать его, но в этом случае значение не переносится.

Работает ли контекст иначе с ifэлементы?Как я могу увидеть, где я нахожусь по отношению к другим элементам?

1 Ответ

0 голосов
/ 28 мая 2018

Когда вам нужен этот путь в вашем <xsl:template>, чтобы добраться до элемента, который вы хотите проверить:

s0:PRILoop1/s0:PRI/s0:C509/C50901[.='AAB']

... тогда вы не можете использовать этот путь в вашем <xsl:if>, чтобы добраться доэлемент, который вы хотите вставить:

../C50902

Это потому, что узел контекста в <xsl:if> по-прежнему остается в том же месте выше в дереве.Вам понадобится полный путь, чтобы добраться до него:

s0:PRILoop1/s0:PRI/s0:C509/C50901[.='AAB']/../C50902

К счастью, гораздо проще и логичнее просто изменить узел контекста.Вы можете сделать это с помощью <xsl:for-each> (даже если есть только один узел для «итерации»):

<xsl:for-each select="s0:PRILoop1/s0:PRI/s0:C509[C50901='AAB']">
    <!-- ...we are at the <s0:C509> element at this point! -->
    <UnitPrice>
        <xsl:value-of select="C50902"/>
    </UnitPrice>
</xsl:for-each>

Это удваивается как <xsl:if>.Когда s0:PRILoop1/s0:PRI/s0:C509[C50901='AAB'] не существует, цикл не запускается.


Идиоматически, у вас будет отдельный шаблон:

<xsl:template match="foo">
    <!-- just output that <s0:C509>, the XSLT engine will decide what to do -->
    <xsl:apply-templates select="s0:PRILoop1/s0:PRI/s0:C509" />
</xsl:template>

<xsl:template match="s0:C509[C50901='AAB']">
    <UnitPrice>
        <xsl:value-of select="C50902"/>
    </UnitPrice>
</xsl:for-each>

<xsl:template match="s0:C509[C50901='SomethingElse']">
    <SomethingElse>
        <xsl:value-of select="SomethingElse"/>
    </SomethingElse>
</xsl:for-each>

<!-- any <s0:C509> we don't have a template for will be suppressed -->
<xsl:template match="s0:C509" />

Это имеет смысл, когда у вас более одногоВ данном случае эффект заключается в выражении switch.


Как я могу увидеть, где я нахожусь по отношению к другим элементам?

контекстный узел обычно остается прежним.Представьте себе хаос, когда узел контекста волшебным образом будет чем-то другим только потому, что вы сделали <xsl:if test="...">.

. Лишь очень немногие конструкции, которые изменяют контекст, в основном <xsl:for-each>, <xsl:apply-templates> и <xsl:for-each-group>,См. Список инструкций / функций XSLT, которые изменяют узел контекста?

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