XML:以最佳方式定义变量

从相同的输入我有不同的 xpaths 相同的元素(除了 1 个元素,它几乎完全相同的路径,见下文)

我的逻辑取决于元素“类型学”(在我的代码中定义)

XSLT 1.0

<xsl:variable name="date">
<xsl:choose>
<xsl:when test="$typology='A' or $typology='B' ">
<xsl:value-of select="/Header/info/data/Body/basketaB/date"/>
</xsl:when>
<xsl:when test="$typology='C' or $typology='D' or $typology='E'">
<xsl:value-of select="/Header/info/data/Body/basketCDE/date"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'CheckPath'"/>
</xsl:otherwise>
</xsl:choose>

如何避免使用选择 + 多条路径并从 1 个路径获取“日期”。

xiariweiyang 回答:XML:以最佳方式定义变量

日期定义为:

<xsl:variable name="date" select="//date"/>
,

我会避免使用后代轴并使用更明确的路径:

<xsl:variable name="date" select="/Header/info/data/Body/*/date"/>

这是假设输入不能同时包含 basketABbasketCDE 元素(这一点从您的问题中不清楚,但否则这和当前接受的答案都不起作用)。


如果上述假设不正确,您可以这样做:

<xsl:variable name="date" select="/Header/info/data/Body/*[contains(name(),$typology)]/date"/>
,

使用这个单一的 XPath 1.0 表达式

concat(/Header/info/data/Body/basketAB
                               [contains('|A|B|',concat('|',$typology,'|'))]/date
     | /Header/info/data/Body/basketCDE
                              [contains('|C|D|E|','|'))]/date,substring('CheckPath',1 div not(contains('|A|B|C|D|E|','|'))))
      )

使用 XSLT 1.0 进行验证

给定这个源 XML 文档:

<Header>
  <info>
    <data>
        <Body>
          <basketAB>
             <date>date1</date>
          </basketAB>
          <basketCDE>
             <date>date2</date>
          </basketCDE>
        </Body>
    </data>
  </info>
</Header>

这个 XSLT 转换计算上面的 XPath 表达式并输出这个计算的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="typology" select="'A'"/>

  <xsl:template match="/">
    <xsl:variable name="date" select=
      "concat(/Header/info/data/Body/basketAB[contains('|A|B|','|'))]/date
            | /Header/info/data/Body/basketCDE[contains('|C|D|E|','|'))))
              )"/>
    <xsl:value-of select="$date"/>
  </xsl:template>
</xsl:stylesheet>

多次运行转换,每次为变量 $typology 指定不同的值:

在所有情况下都会产生想要的结果

'A' --> 日期 1

'B' --> 日期 1


'C' --> 日期 2

'D' --> 日期 2

'E' --> 日期 2


'X' --> 检查路径

本文链接:https://www.f2er.com/4959.html

大家都在问