1

JavaプログラムでXSLT前処理を実行しているときに問題が発生しました。メインフレームプログラムが値を空白にしたい場合は、アスタリスク(*)を取得します。これは、Javaプロセスが空白または空のタグのように処理する必要があります。したがって、jaxbプロセスの前にxsltを入力に適用します。

このxsltを適用しています:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="no"/>
  <xsl:template match="@*[. = '*']">
    <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
      <xsl:text></xsl:text>
    </xsl:attribute>
  </xsl:template>
  <xsl:template match="*[. = '*']">
    <xsl:copy>
      <xsl:text></xsl:text>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

上記のxsltは、ほとんどすべてのテストケースで正常に機能します。サブ要素が1つだけで、それがたまたまアスタリスクである場合を除きます。

たとえば、入力でこれを考慮してください。

<MYROOT><Address3><Line2>*</Line2><Line3>*</Line3></Address3></MYROOT>

うまく機能します。次の出力が生成されます。

<MYROOT><Address3><Line2/><Line3/></Address3></MYROOT>

ただし、以下のxml入力は、誤った応答を生成します。

<MYROOT><Address4><PermanentAddress><Line2>*</Line2></PermanentAddress></Address4></MYROOT>

しかし、応答を与える代わりに

<MYROOT><Address4><PermanentAddress><Line2></Line2></PermanentAddress></Address4></MYROOT>

それはこれを与えます:

<MYROOT/>

助けてください。コードのテスト中にこのテストケースがなかったので、どんな助けでもありがたいです。

4

2 に答える 2

1

これ.は、すべての内部テキスト ノードの連結である内部テキストであるためです。子ノードがないか、コンテンツとして * を含むテキスト ノードのみが存在することを条件で確認する必要があります。

これはうまくいくはずです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="*[not(*) and (. = '*')] | @*[. = '*']">
        <xsl:copy />
    </xsl:template>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
于 2010-06-21T19:34:41.783 に答える
1

置換:

<xsl:template match="*[. = '*']"> 
    <xsl:copy> 
      <xsl:text></xsl:text> 
    </xsl:copy> 
  </xsl:template>

  <xsl:template match="*[not(*) and not(text()[2])]/text()[.='*']"/>

要素の文字列値はすべての子孫テキスト ノードの連結であるため、これはすべての要素の文字列値を計算するよりもはるかに効率的です。

于 2010-06-21T19:43:10.310 に答える