如何通过使用 xslt 比较另一个 xml 来更改元素值



我有下面的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>

相关内容

  • 没有找到相关文章

最新更新