我正在处理 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>
如果类型等于PLANE或CAR,我需要在Mappings块中将操作从ADD_NEW更改为UPDATE_OLD.
我一直在关注人们对XSL的其他例子,并试图围绕如何启动但不能.我使用的工具支持XSL,并且有一个自定义软件,我可以将XSL模板放入其中,它将把它应用于我指定的XML消息.
但我不知道从哪里开始 – 听起来有风险,“请为我做我的工作,SO用户”,如果有人能给我至少一个关于我如何首先指向我的结构的起点然后如何改变值IF x = y.
感谢大家.
XSLT背后的想法是遍历输入XML树并从XML节点生成新输出.在最基本的形式中,这是通过模板匹配完成的.
>根据条件编写与某些节点匹配的模板,以及
>编写将模板应用于节点的代码(related read).
最基本的模板是身份模板.
<xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*" /> </xsl:copy> </xsl:template>
这是非常不明确的;它可以匹配任何节点,只需递归调用自身,复制它找到的任何东西.这会生成一个与输入相同的输出文档,因此也就是名称.
当您添加更多特定模板时,它会变得更有趣,因为XSLT将在不太具体的模板上选择更匹配的模板.
就像这个,它特别只匹配属于具有@type PLANE或CAR的元素的@action属性.它不是复制,而是创建一个具有相同名称但值不同的新属性节点.
<xsl:template match="@action[../@type = 'PLANE' or ../@type = 'CAR']">"> <xsl:attribute name="action">ADD_OLD</xsl:attribute> </xsl:template>
这两个模板一起实现了你想要的.通用版本按原样复制所有内容,除非更具体的一个匹配某个节点.