你能把xsl:if测试放在xslt中的Choose语句中吗?

时间:2013-10-22 02:54:28

标签: xml xslt xpath

我必须建立一个小的条件语句,我不确定最好的方法。我也不确定你是否可以在选择/何时声明中加入IF测试。 (我假设你不能??)

尝试解决以下问题: 将“custom_field”从一个系统映射到单独系统中的“Position”:如果自定义字段恰好为空白,则默认为在系统A中从系统A到“位置”的相同命名字段“位置”中传递的值。

默认情况下,“位置”会出现,并且在xml中永远不应为空白,但自定义字段可能为空白。首选项是使用自定义字段,但如果为空,则应启用默认数据。

<user>
<Custom_Field>Data</Custom_Field>
<Position>Data</Position>
</user>

这是合法的吗?

<xsl:choose>
   <xsl:if test="custom_field != ''">
      <Position><xsl:value-of select='.'/></Position>
   </xsl:if>
</xsl:choose>

或者,Choose语句仅适用于When? 如何评估自定义字段是否为空白,如果为空,则设置默认方案?

对不起 - 这是一个水槽或游泳环境,我还在学习。非常感谢所有帮助,并注明以供将来参考。

我正在尝试基于XML中的数据实现的可能方案:

场景1: 输入XML:

<user>
<Custom_Field>Admin</Custom_Field>
<Position>Teacher</Position>
</user>

输出XML:

<user>
   <Position>Admin</Position>
</user>

场景2: 输入XML:

<user>
<Custom_Field></Custom_Field>
<Position>Teacher</Position>
</user>

输出XML:

<user>
   <Position>Teacher</Position>
</user>

2 个答案:

答案 0 :(得分:3)

我想补充一点:XSLT初学者经常过度使用xsl:choose。您没有显示足够的代码来查看这是否是这种情况。但很多时候,在XSLT中进行条件处理的正确方法是将模板规则分解为较小的规则,并将谓词放入匹配模式中,例如

<xsl:template match="para[@class='x']>...

<xsl:template match="para[@class='y']>...

答案 1 :(得分:1)

xsl:choose内,您只能使用xsl:whenxsl:otherwise。伪代码xsl:choose可以写成

if (condition 1)
...
else if (condition 2)
...
else if (condition 3)
...
else
...

其中ifelse ifxsl:whenelsexsl:otherwise

xsl:if这只是一个条件:

if (condition)
...

<强>更新

输入:

<user>
  <Custom_Field>Data1</Custom_Field>
  <Position>Data2</Position>
</user>

<强> XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/user">
    <Position>
      <xsl:choose>
        <xsl:when test="Custom_Field != ''">
          <xsl:value-of select='Custom_Field'/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select='Position'/>
        </xsl:otherwise>
      </xsl:choose>
    </Position>
  </xsl:template>
</xsl:stylesheet>