Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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 XSL:当属性Y为';A';,B';或';F';?_Xml_Xslt - Fatal编程技术网

Xml XSL:当属性Y为';A';,B';或';F';?

Xml XSL:当属性Y为';A';,B';或';F';?,xml,xslt,Xml,Xslt,我正在处理一个XML请求,如果另一个属性值等于一个或多个值,我需要更改元素的属性值。Xpath不能更新XML本身(据我所知),我一直在研究XSL,但它非常复杂,我通常不使用XML 这是我正在使用的XML的精简版本: <t6:Catalogue xmlns:t6="http://xxx.yy.com"> <t6:Items> <t6:Item /> <t6:Item /> <t6:Item

我正在处理一个XML请求,如果另一个属性值等于一个或多个值,我需要更改元素的属性值。Xpath不能更新XML本身(据我所知),我一直在研究XSL,但它非常复杂,我通常不使用XML

这是我正在使用的XML的精简版本:

<t6:Catalogue xmlns:t6="http://xxx.yy.com">
    <t6:Items>
        <t6:Item />
        <t6:Item />
        <t6:Item />
    </t6:Items>
    <t6:Mappings>
        <t6:Mapping action="ADD_NEW" type="MAP"></t6:Mapping>
        <t6:Mapping action="ADD_NEW" type="FOO"></t6:Mapping>
        <t6:Mapping action="ADD_NEW" type="CAR"></t6:Mapping>
        <t6:Mapping action="ADD_NEW" type="PLANE"></t6:Mapping>
        <t6:Mapping action="ADD_NEW" type="MAP"></t6:Mapping>
    </t6:Mappings>
</t6:Catalogue>

如果type等于PLANE或CAR,我需要在Mappings块中将操作从ADD_NEW更改为UPDATE_OLD

我一直在研究人们的其他XSL示例,并试图了解如何启动XSL,但无法做到这一点。我使用的工具支持XSL,并且有一个自定义的软件,我可以将XSL模板放入其中,它将把它应用到我指定的XML消息中

但我不知道从哪里开始——可能听起来像“请为我做我的工作,所以用户”,如果有人能至少给我一个起点,告诉我如何首先指向我的结构,然后如何更改x=y的值


谢谢大家。

如果您只想更改此特定属性,您可以进行身份转换并使用模板管理
@action

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t6="http://xxx.yy.com"
    exclude-result-prefixes="xs"
    version="2.0">

        <!-- Deleted template match="/" -->

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

        <xsl:template match="@action[../@type = 'PLANE' or ../@type = 'CAR']">
                <xsl:attribute name="action" select="'ADD_OLD'"/>
        </xsl:template>
</xsl:stylesheet>

XSLT背后的思想是遍历输入XML树并从XML节点生成新的输出

在其最基本的形式中,这是通过模板匹配完成的

  • 根据条件编写与特定节点匹配的模板,以及
  • 编写将模板应用于节点()的代码
最基本的模板是标识模板

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

这两个模板一起实现了您想要的功能。泛型表达式按原样复制所有内容,除非更具体的表达式匹配某个节点。

+1此外,也可以使用较短的匹配表达式
@action[../@type=('PLANE','CAR')]
@Mads,但XSLT 1.0中没有。我试图尽可能地兼容这个简单的任务,特别是因为我不知道OP可以使用什么限制。明白了!谢谢你的回复,特别是解释。很有道理。在2.0+中,许多事情都变得更容易。浏览器、Java等中的默认处理器太糟糕了。这使得人们很难继续前进并降级到1.0。。。
<xsl:template match="@action[../@type = 'PLANE' or ../@type = 'CAR']">">
  <xsl:attribute name="action">ADD_OLD</xsl:attribute>
</xsl:template>