2

XML 2.0 を変換するために Saxon9HE を使用しています。Java クラスから。解決策は、この以前の質問
からです。二重パイプで区切られたテキストを XML に変換しています。
ただし、一部のフィールドには人の履歴書が含まれており、変換によってタイトルに記載されているループ エラーがスローされます。

これを修正する方法はありますか?テンプレートスタックの最大深度を増やすことについて読みましたが、それは Oxygen にのみ適用されます。Saxon9HE.jar に同様の設定はありますか?

これがコードです。上記のリンクをクリックしてコードを取得することもできます

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

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

<xsl:template match="str">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:analyze-string select="." regex="\|((\|\s*[^|]+\s*\|)+)\|">
      <xsl:matching-substring>
        <xsl:analyze-string select="regex-group(1)" regex="\|\s*(\w+):([^|]+?)\s*\|">
          <xsl:matching-substring>
            <xsl:element name="{regex-group(1)}">
              <xsl:value-of select="regex-group(2)"/>
            </xsl:element>
          </xsl:matching-substring>
        </xsl:analyze-string>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:copy>
</xsl:template>


</xsl:stylesheet>  

ありがとうございました、

4

1 に答える 1

2

2 つの可能性があります。スタイルシートが無限再帰を実行しているか、最終的に終了する深い再帰を実行しているが、必要なスタック スペースが多すぎるかのいずれかです。

最初のステップは、これらのどれが該当するかを調べることです。コードを確認せずにそれを行うことはできません。

終了しない再帰の場合は、明らかに修正が必要なコードのバグです。

深いが有限の再帰である場合、利用可能なリソースを増やすことで解決策があるかもしれませんが、それは限界にどれだけ近づいているかによって異なります。実際の経験則として、約 500 レベルを超える深さの再帰を試行しないでください。

深い再帰を避けるためにコードを書き直す方法はいくつかあります。

(a) Saxon のテールコール最適化を利用できる可能性があります

(b) 頭尾再帰の代わりに分割統治再帰アルゴリズムを使用できる場合があります

(c) xsl:iterate または xsl:analyze-string または fold-left() 関数を使用するなどして、再帰を完全に回避できる場合があります。

しかし、あなたが何をしようとしているのかを見なければ、これ以上のことはできません。コードを見せてください!

于 2013-08-04T14:16:13.567 に答える