1

ANT を使用して、外部 XML ファイル内の XML タグをコメント化する最も簡単な方法を探しています。XMLTask にはコメント解除機能がありますが、何らかの理由でコメントはありません。

これはreplaceregexpまたはreplaceで実現できましたが、もっと簡単な方法があるはずなので、そうしません。

たとえば、file.xml があるとします。

<KeepMeTag someAttribute="something">
<SomeOtherTag someAttribute="something" />

...ANT を使用して、SomeOtherTag をコメントアウトして、次のようにするにはどうすればよいでしょうか。

<!-- <SomeOtherTag someAttribute="something" /> -->

実際のタグ自体にはいくつかの正規表現と他のいくつかの属性があり、かなり長いことに注意してください。したがって、XPath を介して SomeOtherTag タグにアクセスし、「コメント!」と言う方法をお勧めします...それが可能な場合は、特定の文字列の出現を「置換」するのではなく、a) 非常に長いため、ビルドに追加し、b) XML がわずかに変更されるとビルドが壊れる可能性があります。

何か案は?

4

3 に答える 3

1

Saxon-B 9.1.0.8を使用すると、かなりクリーンなソリューションが得られます。

source.xml

<root>
    <KeepMeTag someAttribute="something">
        <SomeOtherTag someAttribute="something" />
    </KeepMeTag>
</root>

build.xml

<project name="ant-xslt-comment-out-element" default="run" basedir=".">
    <target name="run">
        <fail unless="out.dir"/>

        <xslt 
            style="transform.xsl"
            includes="source.xml"
            destdir="${out.dir}"
        >
            <factory name="net.sf.saxon.TransformerFactoryImpl"/>
            <identitymapper/>
        </xslt>
    </target>
</project>

変換.xsl

<?xml version="1.0"?>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:saxon="http://saxon.sf.net/"
>
    <xsl:output method="xml" indent="yes" />

    <!-- To serialize with saxon:serialize() -->
    <xsl:output name="default" indent="yes" omit-xml-declaration="yes"/>

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

    <xsl:template match="SomeOtherTag">
        <xsl:comment>
            <xsl:value-of select="saxon:serialize(., 'default')" />
        </xsl:comment>
    </xsl:template>
</xsl:stylesheet>

アリコマンド

ant -lib saxon9.jar

結果の XML

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <KeepMeTag someAttribute="something">
        <!--<SomeOtherTag someAttribute="something"/>-->
    </KeepMeTag>
</root>
于 2013-11-06T15:49:07.543 に答える
1

replaceregex タスクを見てください。それはトリックを行うことができるはずです。複数の場所で使いやすくするために、マクロ定義でラップできます。

それはこのように見えるかもしれません。私はこれをテストしていません。>属性値に書かれたものは気にしないことに注意してください

<macrodef name="outcomment">
  <attribute name="file">
  <attribute name="tagName">
  <sequential>
    <replaceregexp file="@{file}"
           match="(<@{tagname}[^>]/>)"
           replace="<!--\1 -->"
     />
  </sequential>
</macrodef>

正規表現は、ネストされたタグを照合するのに苦労することに注意してください。他のタイプのネストされたタグしかない場合は、終了タグを一致させることができます。同じ名前のタグがネストされている場合は不可能です。

より高度なものが必要な場合は、独自のタスクを作成することを検討してください。

于 2013-11-06T12:45:53.040 に答える
-1

と呼ばれる作業中に、別のアリ タスクに出くわしましたxmltask。彼ら自身の紹介を引用するには:

xmltask は、Ant ビルドの一部として XML ファイルを自動的に編集する機能を提供します。Ant で提供される標準フィルター タスクとは異なり、XML に依存しますが、XSLT を定義する必要はありません。

私はそれについての経験はありませんが、ドキュメントを見てください: http://www.oopsconsultancy.com/software/xmltask/

于 2013-11-27T16:52:24.710 に答える