更改第一个XML的值 - 动态

时间:2015-10-07 16:47:27

标签: xml xslt

我想请教您一些建议/帮助如何解决我的问题。老实说,我不确定是否可以使用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

如果无法动态执行,可能会静态执行此操作吗? 提前致谢

1 个答案:

答案 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