2012-01-19 13 views
1

私は大きなXMLファイルをセットアップして自分のアプリケーションを持っています。各設定には多くのコメントがあります。私はノードに応じていくつかのコメントを削除するためにxslを使用したいと思います。私は私のXSLを実行すると特定のノードからコメントを削除するxsl

<!-- if you need to use storage --> 
<Storage> 
    <!-- Oracle configuration 
    <StorageDb database="OracleService"></StorageDb> 
    --> 
    <!-- SqlServer configuration 
    <StorageDb database="SqlService"></StorageDb> 
    --> 
</Storage> 

私はOracleの構成からわずかコメントを削除したいので、私の結果は次のようになります。

<!-- if you need to use storage --> 
<Storage> 
    <StorageDb database="OracleService"></StorageDb> 

    <!-- SqlServer configuration 
    <StorageDb database="SqlService"></StorageDb> 
    --> 
</Storage> 

私はそれを作るだろうか任意のアイデア?

+2

を参照してください?つまり、コメントからノードを抽出します。 – DRCB

+0

はいあなたは正しいです –

+1

なぜこれにXSLを使いたいですか?そのような変換を実現する方法があれば、それはXSLで多かれ少なかれ醜いハックになるでしょう。この問題を解決するための簡単な検索と置き換えを提案します。 – DRCB

答えて

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

<xsl:template match="comment()"> 
    <xsl:value-of disable-output-escaping="yes" select="substring-after(.,'Oracle configuration')"/> 
</xsl:template> 
+0

悪い回答ではありませんが、d-o-eは限られた状況(XSLTプロセッサがシリアル化の制御権を持っている場合など)でしか動作せず、まったく尊重する必要がないことに注意してください。 – LarsH

2

私が正しいと思えば、コメントノードを削除せずに解析して要素に変換するだけです。あなたはXSLT 2.0と正規表現の機能でそれを行うことができますが、それは良いアイデアだとは思いません。

XSLTを使用しても問題はありませんが、まずコンフィギュレーションファイル用のスクラップを作成する必要があります。のは、そのようなものを想像してみましょう:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    ... 
    <Storage/> 
    ... 
</configuration> 

あなたのXSLTは、そのようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:param name="service" select="'OracleService'"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Storage"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <StorageDb database="{$service}"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

デフォルトの動作は、serviceパラメータの値OracleServiceを選択します。このパラメータのXSLTに別の値を渡すことで、この動作を無効にすることができます。

デフォルトの結果は次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    ... 
    <Storage><StorageDb database="OracleService"/></Storage> 
    ... 
</configuration> 
+0

私はすでにXMLファイルにノードを持っていますが、コメントしています。私はそのノードのコメントを解除する必要があります。申し訳ありません、それは明確ですか? –

+0

はい、私はXMLにコメントがあることを理解しましたが、コメントアナライザのより堅牢な代替案は、設定ファイルを構築するための入力パラメータを持つXSLTファイルである可能性があることを指摘したいと思います。 –

+0

"コメントノードを削除せずに解析してXMLノードに変換する" - 私はあなたを "要素に変換する"という意味だと思いますか?それらはすでにXMLノードです。 – LarsH

1

あなたは、私が意味するそれによって(これを行うための堅牢な方法そして、あなたのXSLTプロセッサとしてdisable-output-escapingに依存しない方法をサクソンを使用することができる場合)不要なテキストを取り除いた後、各コメントノードの内容にsaxon:parse()を使用することです。 saxon:parse()の結果はXMLノードであり、通常の方法で結果ドキュメントに出力できます。より多くの議論のために

例えば:

<xsl:template match="comment()"> 
    <xsl:copy-of select="saxon:parse(substring-after(., 'configuration'))"/> 
</xsl:template> 

、あなたは 'コメント解除' いくつかのノードを意味するかXSLT parse text node as XML?

+1

xith 'saxon:parse()'関数は、有効なXML文書を表す文字列を指定する必要があります(http://www.saxonicaを参照してください)。com/documentation/extensions/functions/parse.xml)。したがって、コメントノードでこの関数を使用するには、まずテキスト値( 'substring'、' replace' ...)に対してアクションを実行する必要があります。 –

+0

@VincentBiragnet:あなたはかなり正しいです...私は、チェックせずに 'parse()'がドキュメントフラグメントを解析できると仮定しました。私はそれに応じて私の答えを編集します。 – LarsH

関連する問題