在匹配一个属性的值时将一个完整的元素复制到一个新的XML中,并使用XSLT更改其中另一个属性的值 &

  • 本文关键字:一个 属性 XSLT 另一个 元素 复制 XML xml xslt
  • 更新时间 :
  • 英文 :


大家好,我是XSLT的新手,我有这个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<FN>
<START>     
<VALUE2><VALUE2>
<VALUE3></VALUE3>
<VALUE4></VALUE4>
</START>
<SET name="-RBS_00">
<DISH name="-00_01" QR="Buffer">
<OBJETS>
<Ingredients total="3">
</Ingredients>
</OBJETS>
<Quantity>
</Quantity>
</DISH>
<DISH name="-00_02" QR="RESTO">
<OBJETS meat="poulet">
<Ingredients total="5"></Ingredients>
</OBJETS>
<Quantity>
<Adults numbers="4">
</Adults>
<Kids numbers="3">
</Adults>
</Quantity>
</DISH>
<DISH name="-00_03" QR="DELIVERY">
<OBJETS meat="jam">
<Slices total="3"></Slices>
</OBJETS>
<OBJETS meat="chicken">
<Slices total="5"></Slices>
</OBJETS>
<OBJETS meat="porc">
<Slices total="1"></Slices>
</OBJETS>
<Quantity>
<Adults numbers="1">
</Adults>
<Kids numbers="1">
</Adults>
</Quantity>
</DISH
<DISH name="-00_04" QR="KIDS">
<OBJETS meat="veggie">
<Ingredients total="11"></Ingredients>
</OBJETS>
<Quantity>
<Adults numbers="10">
</Adults>
<Kids numbers="2">
</Adults>
</Quantity>
</DISH
<SET>
</FN>

当属性名称的值为"-00_03"时,我试图复制盘子的整个元素。元素中是否有任何属性匹配meat="porc"换成肉="奶酪"所以我将有一个新的xml,如:

<DISH name="-00_03" QR="DELIVERY">
<OBJETS meat="jam">
<Slices total="3"></Slices>
</OBJETS>
<OBJETS meat="chicken">
<Slices total="5"></Slices>
</OBJETS>
<OBJETS meat="cheese">
<Slices total="1"></Slices>
</OBJETS>
<Quantity>
<Adults numbers="1"></Adults>
<Kids numbers="1"></Adults>
</Quantity>
</DISH>

这是我必须复制元素的XSLT(它根本不起作用),对于更改属性的值我不知道。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/FN/SET">
<xsl:copy>
<xsl:copy-of select="*"/>
<xsl:copy-of select="//DISH [@name='-00_03']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

任何帮助都将非常感激,提前感谢您。

(XML源文件中有几个错别字)

样式表应该包含

  • 递归复制节点("默认规则")的模板
  • 默认规则的例外模板
  • 一个带有match="/"的模板,它给出了起点。

本例中的三个模板是:

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="OBJETS/@meat[.='porc']">
<xsl:attribute name="meat">cheese</xsl:attribute>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="//DISH[@name='-00_03']"/>
</xsl:template>