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要素を作成した後の位置。属性は、子要素の前に要素に追加する必要があります。実際、「子ノードを要素に追加する前に属性ノードを追加する必要があります」というエラーが表示されないことに驚いています。

要素に属性を追加したい場合は、次のことを試してください。

<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>

これにより、一貫した結果が得られるはずです。

また、属性が必要ない場合は、apply-templatesを削除するだけです。

于 2013-01-17T09:18:23.763 に答える
0

xsltprocの動作は私には正しくないようです。Tim Cが言うように、仕様には2つのオプションがあります。属性を無視するか、エラーを通知するかです。要素の適切な場所に実際に属性を追加するオプションは許可されていません。ただし、仕様で「回復可能なエラー」が定義されているこれらのケースでは、エラーに対して誤った回復アクションを取得することは、特にユーザーが意図したとおりに回復アクションを実行する場合は、それほど深刻な不適合ではありません。事実は、スタイルシートにエラーがあり、修正する必要があるということです。

于 2013-01-17T11:22:18.013 に答える