我正在寻找使用ANT在外部XML文件中注释掉XML标记的最简单方法。由于某种原因,XMLTask有一个取消注释的功能,但没有注释。
我可以用replaceregexp或者替换来实现这一点,但我不愿意,因为看起来应该有一个更简单的方法。
例如,假设我有file.xml:
<KeepMeTag someAttribute="something">
<SomeOtherTag someAttribute="something" />
...我怎么能用ANT注释掉SomeOtherTag,看起来像是这样:
<!-- <SomeOtherTag someAttribute="something" /> -->
请注意,真实标签实际上本身有一些正则表达式,以及其他几个属性,并且相当长。所以,我更喜欢通过XPath访问SomeOtherTag标签的方法,只是说“评论!”......如果这是可能的,而不是“替换”特定字符串的出现,因为a)它很长添加到我的构建中,以及b)如果XML稍微改变,可能会破坏构建。
有什么想法吗?
答案 0 :(得分:1)
看看replaceregex task。那应该可以做到这一点。为了便于在多个地方使用,您可以将其包装在macrodef。
中它可能看起来像这样。我没有测试过这个。请注意,它不会处理用属性值
写的>
<macrodef name="outcomment">
<attribute name="file">
<attribute name="tagName">
<sequential>
<replaceregexp file="@{file}"
match="(<@{tagname}[^>]/>)"
replace="<!--\1 -->"
/>
</sequential>
</macrodef>
请注意,正则表达式很难匹配嵌套标记。如果您只有其他类型的嵌套标记,则可以匹配结束标记。如果您具有相同名称的嵌套标记,则不可能。
如果您想要更高级的内容,请考虑writing your own task。
答案 1 :(得分:1)
使用Saxon-B 9.1.0.8,您可以拥有一个非常干净的解决方案:
<root>
<KeepMeTag someAttribute="something">
<SomeOtherTag someAttribute="something" />
</KeepMeTag>
</root>
<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>
<?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 version="1.0" encoding="UTF-8"?>
<root>
<KeepMeTag someAttribute="something">
<!--<SomeOtherTag someAttribute="something"/>-->
</KeepMeTag>
</root>
答案 2 :(得分:-1)
在名为xmltask
的工作期间遇到了另一项蚂蚁任务。引用他们自己的介绍:
xmltask提供了自动编辑XML文件的工具,作为Ant构建的一部分。与Ant提供的标准过滤器任务不同,它对XML敏感,但不要求您定义XSLT。
我对此没有经验,但请查看文档: http://www.oopsconsultancy.com/software/xmltask/