XSLT Select with 2 contains

时间:2013-07-11 08:45:34

标签: xslt contains

我们使用以下内容选择'ExperienceInfo'包含'582'的所有节点:

<xsl:apply-templates disable-output-escaping="yes" select="td:Benutzer_zu_Gastro[contains(td:ExperienceInfo, '582')]">

这将选择'Kategorien'包含'Restaurant'的所有节点:

<xsl:apply-templates disable-output-escaping="yes" select="td:Benutzer_zu_Gastro[contains(td:Kategorien, 'Restaurant')]">

我们如何将两者合并为一个语句,以便在ExperienceInfo包含582 AND Kategorien包含餐馆的地方选择ONLY节点?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这很简单,你必须想到“不,那不可能”:

<xsl:apply-templates select="
  td:Benutzer_zu_Gastro[
    contains(td:ExperienceInfo, '582') 
    and contains(td:Kategorien, 'Restaurant')
  ]
">

如果你的XML看起来像<td:ExperienceInfo>582</td:ExperienceInfo>(等),那么它可以变得更简单。

<xsl:apply-templates select="
  td:Benutzer_zu_Gastro[
    td:ExperienceInfo = '582' and td:Kategorien = 'Restaurant'
  ]
">

两个一般性说明

  • 如果您的XML已分隔<td:ExperienceInfo>582,693</td:ExperienceInfo>等列表(请说它没有),则需要使用contains(),但最好包含分隔符以避免使用误报:

    contains(concact(',', td:ExperienceInfo, ','), ',582,')
    
  • disable-output-escaping="yes"不是XSLT处理器的标准功能。正如迈克尔凯指出in the comments,它在<xsl:apply-templates>首先在语法上无效。
    试着摆脱它。 有时无法避免,但往往表明存在设计缺陷 - 它可以输出格式错误的XML,并且是数据和结构分离不当的标志。