Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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
Xml 用XSLT覆盖属性_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Xml 用XSLT覆盖属性

Xml 用XSLT覆盖属性,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有XML: <doc> <p id="123" sec="abc"></p> </doc> 它给了我以下结果: <doc> <p name="myname" id="123" sec="abc"></p> </doc> 预期的结果是: <doc> <p name="myname" id="999" sec="abc"></p> <

我有XML:

<doc>
    <p id="123" sec="abc"></p>
</doc>
它给了我以下结果:

<doc>
   <p name="myname" id="123" sec="abc"></p>
</doc>

预期的结果是:

<doc>
   <p name="myname" id="999" sec="abc"></p>
</doc>


它似乎没有覆盖
id
属性值。如何从XSLT覆盖此值

我现在不能亲自尝试。。。请尽量不要复制“id”属性,因为这将否决xslt中的“id”属性

<xsl:template match="p">
        <p name="myname" id="999">
            <xsl:apply-templates select="node()|@*[local-name() != 'id']"/>
        </p>
</xsl:template>


目前我自己无法尝试。。。请尽量不要复制“id”属性,因为这将否决xslt中的“id”属性

<xsl:template match="p">
        <p name="myname" id="999">
            <xsl:apply-templates select="node()|@*[local-name() != 'id']"/>
        </p>
</xsl:template>

更改模板

<xsl:template match="p">
        <p name="myname" id="999">
            <xsl:apply-templates select="node()|@*"/>
        </p>
</xsl:template>
更改模板

<xsl:template match="p">
        <p name="myname" id="999">
            <xsl:apply-templates select="node()|@*"/>
        </p>
</xsl:template>
或者简单地说:

<xsl:template match="p">
    <p name="myname" id="999" sec="{@sec}"/>
</xsl:template>
或者简单地说:

<xsl:template match="p">
    <p name="myname" id="999" sec="{@sec}"/>
</xsl:template>

关键是,如果您向一个元素添加多个具有相同名称的属性,则最后一个属性将获胜。您的显式id=“999”被认为位于使用xsl:apply templates调用复制的属性之前,因此它没有任何效果


有几种解决方案。您可以避免将模板应用于@id属性(使用应用模板中的选择);您可以为@id属性设置一个模板规则,该规则不会导致复制该属性;或者,您也可以在执行应用模板之后,通过xsl:apply templates指令之后出现的xsl:attribute指令添加id=“999”属性。

关键是,如果您向一个元素添加多个具有相同名称的属性,则最后一个属性获胜。您的显式id=“999”被认为位于使用xsl:apply templates调用复制的属性之前,因此它没有任何效果


有几种解决方案。您可以避免将模板应用于@id属性(使用应用模板中的选择);您可以为@id属性设置一个模板规则,该规则不会导致复制该属性;或者,您可以在执行应用模板后,通过xsl:apply templates指令后显示的xsl:attribute指令添加id=“999”属性。

编辑了我的答案…”我编写了以下XSLT来实现这一点“显然,您还有更多,否则结果会有所不同。所有答案都假设您还拥有身份转换模板。您应该清楚地说明这一点,而不是让我们猜测。编辑我的答案…”我编写了以下XSLT来做到这一点“很明显,您还有更多,否则结果会有所不同。所有答案都假设您还拥有身份转换模板。您应该清楚地说明这一点,而不是让我们猜测。“您可以在执行应用模板后添加id=“999”属性”,该属性只有在元素没有子元素时才有效(当元素命名为
p
时,这似乎不太可能)。如果它没有子元素,为什么还要应用模板呢?@michael.hor257k,如果将它分解为

,那么它应该可以工作。“在执行应用模板之后,可以添加id=“999”属性”,该属性只有在元素没有子元素的情况下才会工作(当元素命名为
p
)时,这似乎不太可能。如果它没有子元素,那么如果将其分解为

那么它应该可以工作。不幸的是,最后一个解决方案对我不起作用。我在互联网上看到过这个解决方案,但它不会改变值。如果我用氧气调试它,它只执行
xsl:attribute
行,什么也不会发生。属性值保持不变。仅供参考:我在结果树上工作(我在变量中创建的树)“也许这会引起一些问题吗?”罗伯茨说,考虑用XML输入、XSLT代码、你想要的结果的最小但完整的样本来发布一个新问题,结果与XSLT处理器有关的信息结合在一起,我确信我们可以分辨出什么是错的。我解决了我的问题。我产生了与以前一样的值。sed父元素属性值并将子元素的位置连接到它。当我更新父属性时,新值不是我的输入树的一部分,而是另一个结果树的一部分。因此属性值不符合预期。因此,上一个解决方案现在可以按预期工作。不幸的是,上一个解决方案不适用于me、 我在互联网上看到过这个解决方案,但它不会改变值。如果我用氧气调试它,它只会执行
xsl:attribute
行,什么都不会发生。属性值保持不变。仅供参考:我处理结果树(我在变量中创建的树)“也许这会引起一些问题吗?”罗伯茨说,考虑用XML输入、XSLT代码、你想要的结果的最小但完整的样本来发布一个新问题,结果与XSLT处理器有关的信息结合在一起,我确信我们可以分辨出什么是错的。我解决了我的问题。我产生了与以前一样的值。sed父元素属性值,并将子元素的位置连接到它。当我更新父属性时,新值不是输入树的一部分,而是另一个结果树的一部分。因此属性值与预期不符。因此,上一个解决方案现在可以按预期工作。
<xsl:template match="p">
    <p name="myname" id="999" sec="{@sec}">
        <xsl:apply-templates/>
    </p>    
</xsl:template>