Когда вам нужен этот путь в вашем <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, которые изменяют узел контекста?