XSLT1.0:中的多个值在方程的右侧部分进行选择



有没有办法在等式的右边放一个以上的值?

<xsl:choose>
<xsl:when test="Properties/LabeledProperty[Label='Category Code']/Value = 600,605,610">

上面的代码返回:

XPath error : Invalid expression
Properties/LabeledProperty[Label='Category Code']/Value = 600,605,610
                                                             ^
compilation error: file adsml2adpay.xsl line 107 element when

我不想使用"OR"的原因是,每个"when"测试的正确部分应该有大约20个数字。

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:config="http://tempuri.org/config"
  exclude-result-prefixes="config"
>
  <config:categories>
    <value>600</value>
    <value>605</value>
    <value>610</value>
  </config:categories>
  <xsl:variable 
    name   = "vCategories" 
    select = "document('')/*/config:categories/value" 
  />
  <xsl:key
    name   = "kPropertyByLabel"
    match  = "Properties/LabeledProperty/Value"
    use    = "../Label"
  />
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="key('kPropertyByLabel', 'Category Code') = $vCategories">
        <!-- ... -->
      </xsl:when>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

这是因为XPath =运算符在处理节点集时会比较左侧的每个节点和右侧的每个节点(与SQL INNER JOIN相当)。

因此,您所需要做的就是根据各个值创建一个节点集。使用临时名称空间,您可以在XSLT文件中正确执行此操作。

还要注意,我引入了一个<xsl:key>,使通过标签选择属性值更加高效。


编辑:您也可以创建一个外部config.xml文件并执行以下操作:

<xsl:variable name="vConfig" select="document('config.xml')" /> 
<!-- ... -->
<xsl:when test="key('kPropertyByLabel', 'Category Code') = $vConfig/categories/value">

XSLT2.0增加了序列的概念。在那里做同样的事情更简单:

<xsl:when test="key('kPropertyByLabel', 'Category Code') = tokenize('600,605,610', ',')">

这意味着您可以很容易地将字符串'600,605,610'作为外部参数传入。

相关内容

  • 没有找到相关文章

最新更新