2

これはおそらくUsing XSLT as an XML preprocessorのほぼカーボン コピーですが、その質問の OP は完全な例を投稿しなかったため、求められたにもかかわらず、応答は XSLT に精通していない人には役に立ちません。どちらも広範囲にわたる Web 検索は役に立ちませんでした。XSLT の文書化は著しく不十分であり、Web 上ではほとんど議論されていないようです。

ともかく ...

次のようなXMLファイル、たとえばfoo.xmlがあります(明らかに大幅に簡略化されています):

 <?xml version="1.0" encoding="UTF-8"?>

 <main>

  <fee>blah</fee>

  <ifdef select="OLD_VERSION">
   <fi>blah blah</fi>
  </ifdef>

  </main>

(C スタイルの #ifdef は、Ian Roberts の回答に照らして "ifdef" ブロックに変更されました)

次のように、Linux で xsltproc コマンドを実行したいと考えています。

xsltproc --stringparam xmlver NEW_VERSION --nonet foo.xslt foo.xml

そして、次の XSLT ファイル foo.xslt を使用して #ifdef セクションを除外します。

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

 <xsl:output method="xml" />
 <xsl:param name="xmlver" required="yes"/>

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

 <xsl:variable name="defines" select="document($xmlver)/defines"/>

 <xsl:template match="ifdef">

  <xsl:variable name="this" select="."/>

  <xsl:for-each select="$defines[def = $this/@select]">
   <xsl:apply-templates select="$this/node()" />
  </xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

(上記の質問への回答を使用して、この XSLT を作成しました。ただし、欠落している要素は、「xmlver」値をどこにどのように組み込むかです。もちろん、上記が正しいという保証はありません。しかし、これは本質的に私が質問しています - これらすべてがどのように機能するようにまとめられていますか?)

建設的な回答は非常に高く評価され、将来同様の要件を持つ多くの人々に役立つことは間違いありません。しかし、退屈で独断的な「なぜそれをしたいのですか?」はやめてください。返信します!

4

3 に答える 3

1

あなたが参照している質問は、ifdefにXML要素を使用するXML構造に基づいているように見えます。あなたの場合、#ifdef行はXML要素ではないため、XSLTテンプレートと一致させることはできません。他のXML対応の処理を行う必要がある場合は、非XMLツール(場合によっては通常のCプリプロセッサー)を使用してifdefを処理し、結果のXMLをXSLTにフィードすることをお勧めします。

前の質問のように、ifdefに実際のXML要素を使用することに満足している場合:

<?xml version="1.0" encoding="UTF-8"?>
<main>
  <fee>blah</fee>

  <ifdef select="OLD_VERSION">
   <fi>blah blah</fi>
  </ifdef>

</main>

次に、xmlverコマンドラインパラメーターを、ifdef定義のセット全体をロードするファイルの場所としてではなく、含める単一のパラメーターとしてどのように扱うかが問題になります(これが前の質問の仕組みです)。それははるかに簡単です:

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

 <xsl:output method="xml" />
 <xsl:param name="xmlver" />

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

 <xsl:template match="ifdef">
 <!-- for the ifdef we want, include all its child elements, text nodes etc
      but not its attributes, for other ifdefs do nothing -->    
  <xsl:if test="@select = $xmlver">
   <xsl:apply-templates select="node()" />
  </xsl:if>
 </xsl:template>

</xsl:stylesheet>

以前の試みでは、を使用しました<xsl:template match="ifdef[@select=$xmlver]">。これは、一部のプロセッサでは機能しますが、xsltprocでは機能しません(XSLT仕様では技術的に許可されておらず、xsltprocは通常のテストハーネスであるXalanよりも厳密です)。

于 2012-09-05T13:53:20.007 に答える
1

提案: xsltproc の代わりに、 m4を使用できますか?

<?xml version="1.0" encoding="UTF-8"?>

 <main>

  <fee>blah</fee>

ifdef(`X',`
   <fi>blah blah</fi>
')

</main>

.

$ m4 jeter.xml
<?xml version="1.0" encoding="UTF-8"?>

 <main>

  <fee>blah</fee>



</main>

.

$ m4 -DX jeter.xml
<?xml version="1.0" encoding="UTF-8"?>

 <main>

  <fee>blah</fee>


   <fi>blah blah</fi>


</main>
于 2012-09-05T14:09:46.607 に答える
0

あなたの一般的なアプローチから始めたいと思います:

XSLT に慣れていない人にとっては、返信は役に立ちません。どちらも広範な Web 検索は役に立ちませんでした。XSLT は文書化が著しく不十分であり、Web 上でほとんど議論されていないようです。

これは基本的に、あなたがよく知らない言語でプログラムを書こうとしていて、グーグルでその言語に関する情報を見つけようとしていることを示しています。それは良い学習戦略ですか?

たとえば、「XSLT チュートリアル」では 2,300,000 ヒットが得られます。上位のものはすべて読む価値があります。それを「文書化が不十分で、ほとんど議論されていない」と説明するのは奇妙に思えます。

個人的には、新しい言語でプログラミングを始める場合は、常にそのテーマに関する本を読むことから始めます。オンライン教材は、テキストブックほど慎重に設計、作成、レビューされることはめったにありません。もちろん、私は最も人気のある XSLT 参考書の 1 冊の著者であるため、そう言うでしょうが、それにもかかわらず、それは真実だと思います。

さて、あなたの問題を解決できますか。そうじゃなくて、残念です。一部の人々は、このフォーラムでの質問に対して、理解していなくても使用できるテスト済みのコードを使用して回答しています。私はしません: 私は単に人々を正しい方向に向けるだけです。そして、あなたが理解できない言語のコードの断片を提供するつもりはありません。この場合、正しい方向を示すことは、言語を使用する前にその言語を学ぶように指示することを意味します.

于 2012-09-05T16:25:24.697 に答える