0

我注意到 xalan-c 和 xsltproc 之间的以下区别。其中哪一项是正确的?规范对此有何评论?

源xml:-

<a attr="val1">
  <b d="5">
  </b>
  <b d="10">
  </b>
</a>

样式表:-

<xsl:template match="@* | text() | comment() | processing-instruction()">
  <xsl:copy/>
</xsl:template>

<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="a">
  <a>
    <c>
      <xsl:call-template name="gcd">
        <xsl:with-param name="nums" select="./b/@d"/>
      </xsl:call-template>
    </c>
    <xsl:apply-templates select="./@*"/>
  <a>
</xsl:template>

xsltproc 给了我:-

<a attr="val1">
  <c>5</c>
</a>

虽然 xalan-c 给了我:-

<a>
  <c>5</c>
</a>
4

2 回答 2

1

我认为问题可能出在这条线上

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

特别是它的位置,即在模板中创建c元素之后。属性应该在任何子元素之前添加到元素上。事实上,我很惊讶您没有收到“必须在元素的任何子节点之前添加属性节点”这样的错误。

假设您确实希望将属性添加到a元素,请尝试以下操作

<xsl:template match="a">
  <a>
    <xsl:apply-templates select="@*"/>
    <c>
      <xsl:call-template name="gcd">
        <xsl:with-param name="nums" select="./b/@d"/>
      </xsl:call-template>
    </c>
  <a>
</xsl:template>

这应该会给出一致的结果。

如果您不想要这些属性,只需删除应用模板

于 2013-01-17T09:18:23.763 回答
0

xsltproc 行为对我来说似乎不正确。正如 Tim C 所说,规范提供了两种选择:忽略属性或发出错误信号。它不允许将属性实际添加到元素的适当位置的选项。但是,对于规范定义“可恢复错误”的这些情况,为错误执行错误的恢复操作并不是非常严重的不合格,尤其是当恢复操作是为了执行用户可能想要的操作时。事实上,样式表是错误的,应该修复。

于 2013-01-17T11:22:18.013 回答