我有下面的xml 1和xml2。我想将 xml1 中的</publication>
与 xml2 进行比较,并使用 xml2 中的值更新 xml1 中的<price>
。请帮帮我。
我将整个 xml2 存储在一个变量中。我得到了一个寻找 match="book" 的模板,在其中我通过 xml2 变量解析它并匹配发布与 xml1 中的发布。如果匹配,则调用匹配="价格"但 它在内部添加新标签,但不更新现有标签。
XML-1
<books>
<book>
<name>abc</name>
<publication>triangle</publication>
<price></price>
</book>
<book>
<name>def</name>
<publication>rectangle</publication>
<price></price>
</book>
</books>
XML-2
<resource>
<prices>
<publication>triangle</publication>
<price>100</price>
<prices>
<prices>
<publication>rectangle</publication>
<price>200</price>
<prices>
</resource>
预期产出
<books>
<book>
<name>abc</name>
<publication>triangle</publication>
<price>100</price>
</book>
<book>
<name>def</name>
<publication>rectangle</publication>
<price>200</price>
</book>
</books>
你可以试试这个:
<?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" exclude-result-prefixes="xs" version="2.0">
<xsl:variable name="book1" select="document('file:////C://mohit//Untitled23.xml')/resource" as="node()"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//price">
<xsl:variable name="pub" select="preceding-sibling::publication[1]"/>
<xsl:variable name="bk" select="$book1//price[preceding-sibling::publication[1] = $pub][1]"/>
<price>
<xsl:value-of select="$bk"/>
</price>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="back" select="if (doc-available('b.xml')) then doc('b.xml') else ()"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="book">
<book>
<xsl:apply-templates/>
</book>
</xsl:template>
<xsl:template match="name">
<name>
<xsl:apply-templates/>
</name>
</xsl:template>
<xsl:template match="publication">
<publication>
<xsl:apply-templates/>
</publication>
<price>
<xsl:if test="$back//publication = .">
<xsl:value-of select="$back//prices[. = publication]/price"/>
</xsl:if>
</price>
</xsl:template>
</xsl:transform>