XSLT 2.0分组因不存在的节点而失败

时间:2013-10-31 15:48:08

标签: xml xslt

几天之后,我仍在拼命尝试将XML输出转换为CSV。

源XML包含几个级别的附加“元”条目,只有在不是空的情况下才会出现!

示例:

<export>
 <key authority="0" description="tp 2013-06-13" id="2" name="tp" number="17">
  <meta>
   <additional>
    <field label="Datum" value="21.12.2013"/>
   </additional>
  </meta>
 </key>
</export>

“label”是分组元素,因此是列标题。

在这里提出不同的建议后,我成功使用了这个XSLT片段:

<xsl:key name="kf" match="field" use="@label"/>

<xsl:variable name="keyAddDataCols" as="element(field)+">
<xsl:for-each-group select="/export//key/meta/additional/field" group-by="@label">
<field key="{current-grouping-key()}"/>
</xsl:for-each-group>
</xsl:variable>

<xsl:value-of select="$keyAddDataCols/@key" separator="{';'} "/>

但是如果Source-XML中没有一次出现key / meta / additional / field,则转换失败并带有

  

XTTE0570:不允许空序列作为变量的值   $ keyAddDataCols

我试图忽略“cast”(... as =“element ...”),但它根本不起作用。 我尝试使用“xsl:if test = field”来检查字段的存在,但是saxon9抱怨没有定义keyAddDataCols。

现在我已经没有想法了,非常感谢每一个提示!

1 个答案:

答案 0 :(得分:0)

如果您对没有key/meta/additional/field个元素的最终输出为空而感到高兴,那么只需更改

<xsl:variable name="keyAddDataCols" as="element(field)+">

<xsl:variable name="keyAddDataCols" as="element(field)*">

*而不是+)允许变量包含空序列。