Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用xpath替换xml中的第一个节点属性值_Xpath_Ant_Xmltask - Fatal编程技术网

如何使用xpath替换xml中的第一个节点属性值

如何使用xpath替换xml中的第一个节点属性值,xpath,ant,xmltask,Xpath,Ant,Xmltask,在下面的XML中,需要使用XPath替换名称空间 <application xmlns="http://ns.adobe.com/air/application/4.0"> <child id="1"></child> <child id="2"></child> </application> 及 两者都未能给出愿望输出。为了替换文本,我使用了xmltask replace <xmltask source="

在下面的XML中,需要使用XPath替换名称空间

<application xmlns="http://ns.adobe.com/air/application/4.0">
  <child id="1"></child>
  <child id="2"></child>
</application>

两者都未能给出愿望输出。为了替换文本,我使用了xmltask replace

<xmltask source="${temp.file1}" dest="${temp.file1}">
    <replace path="/application/@xmlns" withText="http://ns.adobe.com/air/application/16.0" />
</xmltask>


问题在于
xmlns
不是一个属性。不能使用XPath选择它

命名空间是XML中节点名称的一部分:
不是具有相同名称和不同属性的两个节点,它们是具有不同名称和属性的两个节点

如果要更改名称空间,必须构造一个全新的节点

XSLT更适合此任务:

<!-- update-air-ns.xsl -->
<xsl:transform
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:air4="http://ns.adobe.com/air/application/4.0"
    xmlns="http://ns.adobe.com/air/application/16.0"
>
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

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

    <xsl:template match="air4:*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:transform>
您可以使用Ant的xslt任务:

<xslt in="${temp.file1}" out="${temp.file1}" style="update-air-ns.xsl" />


问题在于
xmlns
不是一个属性。不能使用XPath选择它

命名空间是XML中节点名称的一部分:
不是具有相同名称和不同属性的两个节点,它们是具有不同名称和属性的两个节点

如果要更改名称空间,必须构造一个全新的节点

XSLT更适合此任务:

<!-- update-air-ns.xsl -->
<xsl:transform
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:air4="http://ns.adobe.com/air/application/4.0"
    xmlns="http://ns.adobe.com/air/application/16.0"
>
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

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

    <xsl:template match="air4:*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:transform>
您可以使用Ant的xslt任务:

<xslt in="${temp.file1}" out="${temp.file1}" style="update-air-ns.xsl" />


您可以发布用于替换的代码吗?您可以发布用于替换的代码吗?您可以解释一下xsl任务吗。我尝试了上面的代码片段,因为它无法替换。我认为如果您想知道
xslt
任务是如何工作的,您需要浏览一下文档。我已经解释了为什么
xmltask
不能做您想做的事情,并提供了一个可以做您想做的事情的解决方案。集成解决方案是你的工作。你能解释一下xsl任务吗。我尝试了上面的代码片段,因为它无法替换。我认为如果您想知道
xslt
任务是如何工作的,您需要浏览一下文档。我已经解释了为什么
xmltask
不能做您想做的事情,并提供了一个可以做您想做的事情的解决方案。集成解决方案是您的工作。
<xslt in="${temp.file1}" out="${temp.file1}" style="update-air-ns.xsl" />