1

有什么方法可以在等式的右侧放置一个以上的值?

<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

我不想使用“或”的原因是因为每个“何时”测试的正确部分应该有大约 20 个数字。

4

1 回答 1

2
<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">

XSLT 2.0 添加了序列的概念。在那里做同样的事情更简单:

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

这意味着您可以轻松地将字符串'600,605,610'作为外部参数传递。

于 2012-07-27T09:20:33.737 回答