使用xsl时XSLT失败:选择测试xsl:for-each的结果

时间:2017-12-23 16:58:49

标签: xml xslt xpath

我有一个xsl:for-each,它汇集了许多不同的元素,然后有条件地处理每个元素。例如:

<xsl:for-each select=".//del | .//sup | .//unc | .//gap">
   <xsl:choose>
      <xsl:when test="del"><xsl:text>Output foo del</xsl:text></xsl:when>
      <xsl:when test="sup"><xsl:text>Output foo sup</xsl:text></xsl:when>
      <xsl:when test="unc"><xsl:text>Output foo unc</xsl:text></xsl:when>
      <xsl:when test="gap"><xsl:text>Output foo gap</xsl:text></xsl:when> 
      <xsl:otherwise><xsl:text>For each works, but the tests do not!</xsl:text></xsl:otherwise>
   </xsl:choose>
<xsl:for-each>

<xsl:for-each>工作正常,因为它输出了很多<otherwise> For each works, but the tests do not!不知怎的,我误解了如何编写@test来捕获每个元素?我认为这与当前的背景有关吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我不确定你想要达到什么目标,但不应该这样读?

<xsl:for-each select=".//del | .//sup | .//unc | .//gap">
    <xsl:choose>
        <xsl:when test="self::del"><xsl:text>Output foo del</xsl:text></xsl:when>
        <xsl:when test="self::sup"><xsl:text>Output foo sup</xsl:text></xsl:when>
        <xsl:when test="self::unc"><xsl:text>Output foo unc</xsl:text></xsl:when>
        <xsl:when test="self::gap"><xsl:text>Output foo gap</xsl:text></xsl:when> 
        <xsl:otherwise><xsl:text>For each works, but the tests do not!</xsl:text></xsl:otherwise>
    </xsl:choose>
<xsl:for-each>

或者,您必须声明xmlns="http://www.w3.org/1999/XSL/Transform",例如在choose甚至for-each内。

答案 1 :(得分:1)

按照另一个答案中的建议更改为test="self::del"可以解决问题,但在XSLT中执行此操作的惯用方法是使用模板规则:

<xsl:apply-templates select=".//*" mode="m"/>

然后

<xsl:template match="del" mode="m">Output foo del</xsl:template>
<xsl:template match="sup" mode="m">Output foo sup</xsl:template>
<xsl:template match="unc" mode="m">Output foo unc</xsl:template>
<xsl:template match="gap" mode="m">Output foo gap</xsl:template>
<xsl:template match="*" mode="m">Otherwise</xsl:template>