首页 > 解决方案 > 将条件测试存储在变量中

问题描述

我对 XSLT陌生,需要转换一个地址 xml 文件。我需要将条件测试的结果存储在一个变量中,我想稍后在同一个模板中使用它。

这是我的源xml:

<?xml version="1.0" encoding="UTF-8"?>
<message>
<partner>
    <addressInfo>
        <addressUsage>
            <Code>Default</Code>
            <Main>false</Main>
        </addressUsage>
        <addressUsage>
            <Code>BILL_TO</Code>
            <Main>false</Main>
        </addressUsage>
        <Address>...</Address>
    </addressInfo>
    <addressInfo>
        <addressUsage>
            <Code>SHIP_TO</Code>
            <Main>false</Main>
        </addressUsage>
        <addressUsage>
            <Code>BILL_TO</Code>
            <Main>true</Main>
        </addressUsage>
        <Address>...</Address>
    </addressInfo>
</partner>
</message>

现在,我需要知道是否有代码为“BILL_TO”且 Main =“true”的地址。我需要将它存储在一个变量中。但在我的测试中,我总是失败。

这是我的 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<!-- copy all nodes and attributes -->  
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>


<xsl:template match="partner">
    <partner>
    <xsl:variable name="main_bill_to">
        <xsl:choose>
            <xsl:when test="(./addressInfo/addressUsage/Code = 'BILL_TO' and Main = 'true')">
                <xsl:value-of select="'Y'" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'N'" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable> 

    <xsl:if test="($main_bill_to = 'Y')">
        <result>yes</result>
    </xsl:if>

    <xsl:if test="($main_bill_to = 'N')">
        <result>no</result>
    </xsl:if>
    </partner>
</xsl:template>
</xsl:stylesheet>

我总是得到输出“否”。

<message>
    <partner>
       <result>no</result>
    </partner>
</message>

任何想法?非常感谢!

标签: xslt

解决方案


这个表述不太对……

<xsl:when test="(./addressInfo/addressUsage/Code = 'BILL_TO' and Main = 'true')">

您实际上是在问“是否有一个元素addressInfo/addressUsage/Code(下partner)等于'BILL_TO',并且是否还有一个元素Main(下partner)等于'true' ”。

换句话说,它正在寻找一个名为Mainunder的元素partner,而不是与您正在检查的元素相同addressUsage的元素。Code

你需要这样做...

<xsl:when test="addressInfo/addressUsage[Code = 'BILL_TO' and Main = 'true']">

所以,这现在是在问“是否有一个addressInfo/addressUsage元素既Code设置为'BILL_TO'又Main设置为'true' ”?

请注意./,这并不是真正必要的,这就是我删除它的原因。

另请注意,您实际上并不需要费尽心思使用 anxsl:choose将变量设置为“Y”或“N”。在这种情况下,您可以将代码块简化为......

<xsl:template match="partner">
  <partner>
    <xsl:variable name="main_bill_to" select="addressInfo/addressUsage[Code = 'BILL_TO' and Main = 'true']" />

    <xsl:if test="$main_bill_to">
        <result>yes</result>
    </xsl:if>

    <xsl:if test="not($main_bill_to)">
        <result>no</result>
    </xsl:if>
  </partner>
</xsl:template>

所以现在,您正在检查元素是否存在以确定要显示的内容。


推荐阅读