gpt4 book ai didi

ant - xmlproperty 并在存在/设置特定属性时检索 xml 元素的属性值

转载 作者:行者123 更新时间:2023-12-02 08:37:47 25 4
gpt4 key购买 nike

我的 Xml 看起来像:

<root>
<foo location="bar"/>
<foo location="in" flag="123"/>
<foo location="pak"/>
<foo location="us" flag="256"/>
<foo location="blah"/>
</root>

对于 foo xml 元素标志是可选属性。

当我说:

<xmlproperty file="${base.dir}/build/my.xml" keeproot="false"/>

<echo message="foo(location) : ${foo(location)}"/>

打印所有位置:

foo(location) : bar,in,pak,us,blah

有没有办法只在标志设置为某个值时获取位置?

最佳答案

Is there a way to get locations only if flag is set to some value?

不适用于 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 以正常方式加载它。

关于ant - xmlproperty 并在存在/设置特定属性时检索 xml 元素的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19545552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com