【问题标题】:XSLT: Get value of xpath based on whether element existsXSLT:根据元素是否存在获取xpath的值
【发布时间】:2012-09-12 22:34:20
【问题描述】:

我会检查一个文档是否包含给定的值和 xpath,如果它确实使用了选定的值,则使用另一个值。我在 XSLT 方面真的很糟糕,但这是我要开始的:

  <xsl:choose>
          <xsl:when test="p//section.std[@type = 'SpecialSection']/p/img/@alt">
            <xsl:apply-templates select="p//section.std[@type = 'SpecialSection']/p/img/@alt"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:apply-templates select="p//meta-data.titles/meta-data.title"/>
          </xsl:otherwise>
        </xsl:choose>         

当前未选择任何值。我怀疑我不能像以前那样编写我的选择测试。我不确定空值是否计算为布尔值。基本上我想测试第一个 xpath 是否返回一个值,它是否使用它,如果不使用块中的那个。

有什么帮助吗?

【问题讨论】:

  • 您正确地进行了测试 - XPath 返回一个节点集,如果节点集不为空,则该节点集被评估为 true。我想错误在于您用于输出值的方法...您是否尝试使用 而不是
  • 特别是,具有alt=""img 将被匹配,即使属性值为空。如果要排除此类匹配项,则需要执行 ..../p/img/@alt[string()] 之类的操作(仅匹配具有非空字符串值的 alt 属性)。
  • 如果没有看到输入,我们无法判断这段代码的 sn-p 是否正确。请提供简化的示例输入文档和预期输出。另外,您使用的是哪个版本的 XSLT? 1.0?还是 2.0?
  • 另外,我注意到您标记了问题xhtml。如果您的输入文档是 xhtml,您的 p 元素将需要 xhtml 前缀。您当前的代码片段将不匹配任何 xhtml:p 元素。
  • 尼克,人们正在尝试猜测。请给我们(编辑问题并在那里输入)源 XHTML 文档和完整转换的小示例。另外,请提供转换的确切所需结果。

标签: xml xslt xhtml


【解决方案1】:

您可以使用以下单个表达式选择想要的节点(下面xsl:variableselect 属性):

<xsl:variable select=
 "p//section.std[@type = 'SpecialSection']/p/img/@alt
 |
  p[not(.//section.std[@type = 'SpecialSection']/p/img/@alt)]
                                           //meta-data.titles/meta-data.title
 "/>

【讨论】:

  • 你的第二个谓词需要包含p/img/@alt
  • @SeanB.Durkin,感谢您发现这个问题 -- 已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多