1

我正在寻找使用 ANT 注释掉外部 XML 文件中的 XML 标记的最简单方法。XMLTask 具有取消注释功能,但由于某种原因没有注释。

我可以使用replaceregexp 或replace 来实现这一点,但我宁愿不这样做,因为看起来应该有更简单的方法。

例如,假设我有 file.xml:

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

...我如何使用 ANT 注释掉 SomeOtherTag 使其看起来像:

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

需要注意的是,真正的标签其实本身就有一些正则表达式,还有其他几个属性,而且比较长。所以,我更喜欢一种通过 XPath 访问 SomeOtherTag 标记的方法,然后说“comment!”...如果可能的话,而不是“替换”特定字符串的出现,因为 a) 它很长添加到我的构建中,并且 b) 如果 XML 略有变化,可能会破坏构建。

有任何想法吗?

4

3 回答 3

1

看看replaceregex 任务。那应该可以解决问题。为了使它更容易在多个地方使用,您可以将它包装在一个macrodef中。

它可能看起来像这样。我还没有测试过这个。请注意,它不关心>写入属性值

<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

使用Saxon-B 9.1.0.8,您可以获得一个非常干净的解决方案:

源代码.xml

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

构建.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

刚刚在工作中遇到了一个替代的蚂蚁任务,叫做xmltask. 引用自己的介绍:

xmltask 提供了作为 Ant 构建的一部分自动编辑 XML 文件的工具。与 Ant 提供的标准过滤任务不同,它是 XML 敏感的,但不需要您定义 XSLT。

我对此没有经验,但请查看文档: http ://www.oopsconsultancy.com/software/xmltask/

于 2013-11-27T16:52:24.710 回答