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 中,但样本不是这种情况提供。
我有一个用于转换数据的 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 中,但样本不是这种情况提供。