【问题标题】:Change the value of first XML - dynamically更改第一个 XML 的值 - 动态
【发布时间】:2015-10-07 16:47:27
【问题描述】:

我想请您提供一些建议/帮助来解决我的问题。老实说,我不确定是否可以使用 XSL 转换。但也许你们中的一些人知道答案。 (不幸的是我是xsl新手)

所以,我有 XML 输入,看起来:

<?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>

我想做一些 XSL 转换,将该结构转换为:

<tag1>
                <tag2>sometext</tag2>
                <tag3>657</tag3>
                <tag4>2344</tag4>
                <tag5>abcd</tag5>
</tag1>

如您所见,来自 TAG3(来自第二个 XML)的值更改了第一个 &lt;tag3&gt;&lt;/tag3&gt;. 的值 不幸的是,它应该动态工作。我的意思是我不知道标签的确切名称是什么。

如果可能的话,对我来说,步骤应该如下所示: 第 1 步:在 XML2 和 XML1 之间寻找相同的标签名称 第 2 步:将值从 XML2 更改为 XML1

如果无法动态执行,是否可以静态执行? 提前致谢

【问题讨论】:

  • 你所拥有的不是 XML,不能被 XSLT 处理。 XML 文档必须有一个根元素。并且 XML 声明只允许在文档的开头。而且你的标签不匹配。
  • 你好 michael,好的,你是对的,我尝试使用适当的 XML 结构。我编辑了我的问题。现在只有一个""
  • 但还是不是XML,因为有两个根元素标签不匹配。

标签: xml xslt


【解决方案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

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多