1

XSL を使用して XML ファイルを読み取るテキスト出力ファイルを作成しています。

ここでは、特定のコンテンツがソース XML で利用可能かどうかを確認し、利用可能な場合はそのコンテンツをファイルに書き込もうとしています。

ただし、コンテンツが利用できない場合 (「<XSL:if>」条件を満たさない場合)、出力ファイルは空のファイルになります。

そのため、実行時にXSL出力ファイルが作成されないように、else条件を追加し、そのelse条件に追加したいと考えています。

手がかりを持っている体はありますか?

<xsl:message terminate="yes"> は、出力を生成しますが、XSL のさらなる処理を終了するだけであるため、役に立ちません。

ファイルを作成した後にファイルを削除しなくても、Javaコードで実行する他のアプローチを助けたり、提案したりすることはできますか。[それらを読み取り、空のファイルを特定することにより]

現在、作成された空のファイルを読み取り、明示的に削除するためにJavaを使用しています。事前に感謝します。

4

1 に答える 1

1

これを行う方法を 2 つ例を挙げて説明します。2 つ目はお勧めです。

次の XML ドキュメントがあるとします。

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

numそして、偶数の要素が「削除」された別のものを生成したいと考えています。

これを行う1つの方法は次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <nums>
       <xsl:apply-templates/>
     </nums>
 </xsl:template>

 <xsl:template match="num">
  <xsl:choose>
   <xsl:when test=". mod 2 = 1">
     <num><xsl:value-of select="."/></num>
   </xsl:when>
   <!-- <xsl:otherwise/> -->
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

必要な結果が生成されます。

<nums>
   <num>01</num>
   <num>03</num>
   <num>05</num>
   <num>07</num>
   <num>09</num>
</nums>

注意してください:「何もしない」場合は必要なく、<xsl:otherwise>コメントアウトされています。

より良い解決策

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="num[. mod 2 = 0]"/>
</xsl:stylesheet>

これにより、同じ正しい結果が得られます。

numここでは、偶数の値と空の本文を持つ要素に一致するテンプレートを使用してアイデンティティ ルールをオーバーライドしています。これは「削除」を行います。

注意してください:

ここでは、"if-then-else" の明示的な命令はまったく使用しません。XSLT の最も特徴的な機能である Xtemplate パターン マッチングのみを使用します。

于 2012-05-30T12:59:02.050 に答える