XML: 以最佳方式定义变量

XML: define variable in an optimal way

从相同的输入我对相同的元素有不同的 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>

如何避免使用 choose +several paths 并从 1 条路径中获取“date”just

解决定义日期为:

<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|', concat('|', $typology, '|'))]/date,
       substring('CheckPath', 
                 1 div not(contains('|A|B|C|D|E|', concat('|', $typology, '|'))))
      )

使用 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|', concat('|', $typology, '|'))]/date
            | /Header/info/data/Body/basketCDE[contains('|C|D|E|', concat('|', $typology, '|'))]/date,
              substring('CheckPath', 1 div not(contains('|A|B|C|D|E|', concat('|', $typology, '|'))))
              )"/>
    <xsl:value-of select="$date"/>
  </xsl:template>
</xsl:stylesheet>

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

所有情况下都能得到想要的结果:

'A' --> date1

'B' --> date1


'C' --> date2

'D' --> date2

'E' --> date2


'X' --> 检查路径