代码之家  ›  专栏  ›  技术社区  ›  Leth

范围如何在XSLT if元素中工作

  •  0
  • Leth  · 技术社区  · 6 年前

    我试图从一个字段中插入一个值,如果具有相同父级的另一个字段具有某个值。

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

    如果c50901='aab',则应将c50902中的值插入单价中。我假设在if元素之后,我需要返回一个级别,然后向下进入兄弟元素来选择它,但是在这种情况下没有值被转移。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tomalak    6 年前

    当你需要这条路的时候 <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:每个> , <xsl:apply-templates> <xsl:for-each-group> . 见 List of XSLT instructions/functions that change the context node?