我想请教您一些建议/帮助如何解决我的问题。老实说,我不确定是否可以使用XSL转换。但也许有些人知道答案。 (不幸的是,我是新手)
所以,我有XML输入,看起来:
(?<!\.)
我想做一些XSL转换,将该结构转换为:
<?xml version="1.0" encoding="UTF-8"?>
<tag1>
<tag2>sometext</tag2>
<tag3>234</tag3>
<tag4>2344</tag4>
<tag5>abcd</tag5>
</tag1>
<tag1>
<tag3>657</tag3>
<tag2>
正如您可以看到来自TAG3(来自第二个XML)的值更改第一个<tag1>
<tag2>sometext</tag2>
<tag3>657</tag3>
<tag4>2344</tag4>
<tag5>abcd</tag5>
</tag1>
的值
不幸的是它应该动态地工作。我的意思是我不确切知道标签的名称。
如果有可能,对我来说步骤应该是这样的: 第1步:在XML2和XML1之间查找相同的标记名称 第2步:将值从XML2更改为XML1
如果无法动态执行,可能会静态执行此操作吗? 提前致谢
答案 0 :(得分:1)
如果您可以将输入预处理为格式良好的 XML,例如:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag1>
<tag2>sometext</tag2>
<tag3>234</tag3>
<tag4>2344</tag4>
<tag5>abcd</tag5>
</tag1>
<tag1>
<tag3>657</tag3>
</tag1>
</root>
然后,您可以应用样式表:
XSLT 1.0
<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:variable name="corrections" select="/root/*[2]/*" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root">
<xsl:apply-templates select="*[1]"/>
</xsl:template>
<xsl:template match="/root/*/*">
<xsl:variable name="correction" select="$corrections[name()=name(current())]" />
<xsl:choose>
<xsl:when test="$correction">
<xsl:copy-of select="$correction"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
返回:
<?xml version="1.0" encoding="UTF-8"?>
<tag1>
<tag2>sometext</tag2>
<tag3>657</tag3>
<tag4>2344</tag4>
<tag5>abcd</tag5>
</tag1>
请注意,这假设所有“更正”都是根元素的第二个子元素的直接子元素(在此示例中为tag1[2]
)。否则它会变得更复杂 - 在这里看到类似的问题:XSLT Merging Data