xslt - 将条件测试存储在变量中
问题描述
我对 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>
任何想法?非常感谢!
解决方案
这个表述不太对……
<xsl:when test="(./addressInfo/addressUsage/Code = 'BILL_TO' and Main = 'true')">
您实际上是在问“是否有一个元素addressInfo/addressUsage/Code
(下partner
)等于'BILL_TO',并且是否还有一个元素Main
(下partner
)等于'true' ”。
换句话说,它正在寻找一个名为Main
under的元素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>
所以现在,您正在检查元素是否存在以确定要显示的内容。
推荐阅读
- activejdbc - ActiveWeb - 渲染父属性值
- angular - NGINX HTTP2 推送 - Angular
- linux - 带有访问令牌的 git pull,带有用户名/密码的 git push
- angular - Why my file app.component.html is not working?
- r - 使用 rbind 将数据作为列而不是 r 中的行添加到数据帧
- php - Symfony 3.4 服务 - Doctrine\ORM\EntityManager 的实例,给定的布尔值
- reactjs - 在渲染函数的 SetTimout() 中使用 setState
- typescript - 将此带有字符串文字的 JS 函数转换为 TS
- reactjs - 新机器上的“react-scripts start”错误
- angular - router.navigate() 不会在 .subscribe 内重定向