0

我有一个用于转换数据的 xslt 模板,我现在拥有的一个选择语句带有一堆 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>

它应该循环遍历 datafield[@tag='300'] 节点,并为它找到的每个节点输出一个基于 xsl:when 的值。

它只输出 else 语句

4

1 回答 1

0

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

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

这只会被评估以尝试是否subfield[@code='e']存在 a ,并且它的值是一个空字符串。如果您的 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语句需要在 XML 中同时存在“a”和“c”,而提供的示例并非如此。

以 http://xsltfiddle.liberty-development.net/ncntCRS为例。

于 2019-09-11T13:33:17.067 回答