只有当标志设置为某个值时,有没有办法获取位置?
不与xmlproperty
,不,因为这将始终将具有相同标签名称的值混为一谈。但是xmltask 可以满足您的需求,因为它支持 XPath 的全部功能:
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask">
<classpath path="xmltask.jar" />
</taskdef>
<xmltask source="${base.dir}/build/my.xml">
<copy path="/root/foo[@flag='123' or @flag='256']/@location"
property="foo.location"
append="true" propertySeparator="," />
</xmltask>
<echo>${foo.location}</echo><!-- prints in,us -->
如果您绝对不能使用第三方任务,那么我可能会通过使用简单的 XSLT 将您想要的 XML 位提取到另一个文件中来解决这个问题:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="targetFlag" />
<xsl:template name="ident" match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="foo">
<xsl:if test="@flag = $targetFlag">
<xsl:call-template name="ident" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
xslt
用任务调用它
<xslt in="${base.dir}/build/my.xml" out="filtered.xml" style="extract.xsl">
<param name="targetFlag" expression="123" />
</xslt>
这将创建filtered.xml
仅包含
<root>
<foo location="in" flag="123"/>
</root>
(空格的模变化),您可以使用 xmlproperty 以正常方式加载它。