xsl 选择忽略 when 元素,只输出 otherwise

xsl choose ignoring the when elements and only outputting the otherwise

我有一个用于转换数据的 xslt 模板,我现在拥有的模板有一个 choose 语句,其中包含针对每种可能性的一系列 when 子句,给出的输出是它似乎忽略了所有 when 和直接去别的地方。

我删除了几个 when 语句以缩短它

我一步步走过来了,把select语句改成了直接看code=a

我的时间出了点问题,但我似乎看不到它

<xsl:for-each select="datafield[@tag='300']">               

<xsl:choose>                            
    <xsl:when test="./subfield[@code='a'] !='' and ./subfield[@code='e'] !='' and ./subfield[@code='c'] !=''">
        <xsl:element name="PhysicalDescription">
            <xsl:value-of select="./subfield[@code='a']" />
        </xsl:element>
        <xsl:element name="CoverColour">
            <xsl:value-of select="./subfield[@code='c']" /> - <xsl:value-of select="./subfield[@code='e']" />
        </xsl:element>
    </xsl:when>

    <xsl:when test="./subfield[@code='a'] !='' and ./subfield[@code='c'] !='' and ./subfield[@code='e'] =''">
        <xsl:element name="PhysicalDescription">
            <xsl:value-of select="./subfield[@code='a']" />
        </xsl:element>
        <xsl:element name="CoverColour">
            <xsl:value-of select="./subfield[@code='c']" />
        </xsl:element>
    </xsl:when>

    <xsl:otherwise>
        <xsl:element name="PhysicalDescription">
            <xsl:value-of select="./subfield[@code='a']" />
        </xsl:element>                               
   </xsl:otherwise>                 
</xsl:choose>

XML数据

    <datafield tag="300" ind1="0" ind2="0">
      <subfield code="a">1-914pp (vol.1)</subfield>
    </datafield>
    <datafield tag="300" ind1="0" ind2="0">
      <subfield code="a">915-2385pp (vol.2)</subfield>
    </datafield>
    <datafield tag="300" ind1="0" ind2="0">
      <subfield code="a">cli, 835p (supp)</subfield>
      <subfield code="e">Pbk</subfield>
    </datafield>
    <datafield tag="300" ind1="0" ind2="0">
      <subfield code="c">navy cover</subfield>
      <subfield code="e">Hbk</subfield>
    </datafield>

它应该遍历数据字段 [@tag='300'] 节点,并为它找到的每个节点输出一个基于 xsl:when.

的值

它只会输出 otherwise 语句

您遇到的问题是这种形式的表达式....

./subfield[@code='e'] =''

只有在 subfield[@code='e'] 存在且其值为空字符串时才会进行评估。如果 XML 中没有 subfield[@code='e'],则表达式的计算结果为 false。

你需要做的是这样写:(注意,在你的任何表达式中都不需要 ./ 前缀)。

not(subfield[@code='e'] !='')

这就像双重否定,但在 subfield[@code='e'] 不存在的情况下,表达式现在被评估为真。

因此,对于给定的 XSLT,不要这样做:

<xsl:when test="./subfield[@code='a'] !='' and ./subfield[@code='c'] !='' and ./subfield[@code='e'] =''">

这样做

<xsl:when test="subfield[@code='a'] !='' and subfield[@code='c'] !='' and not(subfield[@code='e'] !='')">

请注意您给定的 XSLT,xsl:when 语句需要 "a" 和 "c" 出现在 XML 中,但样本不是这种情况提供。

参见 http://xsltfiddle.liberty-development.net/ncntCRS 示例。