Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在xslt中逐字复制xml节点_Xml_Xslt - Fatal编程技术网

如何在xslt中逐字复制xml节点

如何在xslt中逐字复制xml节点,xml,xslt,Xml,Xslt,我主要逐字复制大量XML节点,其中xxx代表一些不感兴趣的名称,如何简化XSLT <xsl:template match="xxx"> <zzz> <wrapper1> <!-- verbatim copying of content of existing wrapper tag which is a list of codes -->

我主要逐字复制大量XML节点,其中xxx代表一些不感兴趣的名称,如何简化XSLT

<xsl:template match="xxx">
    <zzz>
        <wrapper1>
            <!-- verbatim copying of content of existing wrapper tag
                 which is a list of codes -->
            <xsl:for-each select="wrapper1/code">
              <code>
                <xsl:value-of select="."/>
              </code>
            </xsl:for-each>
        </wrapper1>
        <wrapper2>
            <!-- lots of verbatim copying of xml tags
                 to the added wrapper tag -->
            <city>
              <xsl:value-of select="city"/>
            </city>
            <state>
              <xsl:value-of select="state"/>
            </state>
            <postalCode>
              <xsl:value-of select="postalCode"/>
            </postalCode>
            <country>
              <xsl:value-of select="country"/>
            </country>
            <!-- etc etc -->
        </wrapper2>
    </zzz>
</xsl:template>
与此类似,但缺少地址字段的包装器标记:

<xxx>
  <wrapper1>
    <code>001</code>
    <!-- more codes may be present, hence xsl:for-each -->
  </wrapper1>
  <wrapper2> <!-- wrapper added by xslt -->
    <city>Amsterdam</city>
    <state>NH</state>
    <postalCode>1234AA</postalCode>
    <country>Holland</country>
  </wrapper2>
</xxx>
所有这些包装器标记的目的是,它可以编写一个XSD模式,来自Microsoft SDK的XSD.exe可以使用它来创建C#类,以便与数据库表格式很好地匹配,这样我就不必在C#类中写入所有这些字段名


我发现xslt语法很棘手,尽管我成功地使上述内容真正起作用,但我想xslt中仍然有一些智能功能可以使事情更好地工作。

我想您只是想

<xsl:template match="xxx">
    <zzz>
        <xsl:copy-of select="wrapper1"/>
        <wrapper2>
            <xsl:copy-of select="* except wrapper1"/>
        </wrapper2>
    </zzz>
</xsl:template>
它逐层递归复制节点,并使用模板覆盖它,以便进行所需的更改(例如在您的案例中)

<xsl:template match="xxx">
  <zzz>
    <xsl:apply-templates select="wrapper1"/>
    <wrapper2>
       <xsl:apply-templates select="*[not(self::wrapper1)]"/>
    </wrapper2>
  </zzz>
</xsl:template>

尽管Martin的答案更为复杂,但基于他对以下内容的解释,我已经非常满意这个解决方案:

<xsl:template match="xxx">
  <zzz>
    <xsl:copy-of select="wrapper1" />
    <wrapper2>
      <xsl:copy-of select="city" />
      <xsl:copy-of select="state" />
      <xsl:copy-of select="postalCode" />
      <xsl:copy-of select="country" />
    </wrapper2>
  </zzz>
</xsl:template>

对于几十个字段,Martin的解决方案会更好,但实际上我有大约15个字段

在使用诸如C#xslt.transform之类的microsoft工具时,我最好坚持使用XSLT1.0的基本功能。另外,我还称自己是xml新手,这更容易理解


不管怎样,谢谢你,马丁+1

那么输入XML的外观如何?您是否不知道
?你知道身份转换是大多数XML-to-XML转换的基础吗?你想复制、更改和/或删除一些东西吗?@MartinHonnen输入XML添加了,是的,我听说过xsl:copy,但在谷歌上搜索时,我没有找到帮助我理解它的东西来帮助解决我的问题。另外,wrapper1的技巧也不错,但是对于city、state等字段的技巧更受欢迎,因为我们的表有很多字段。我使用Microsoft的XslCompiledTransform,它是XSLT 1.0处理器,但我也会尝试您的XPath1选项。我猜语法将允许排除更复杂的输入xml的两个包装器。我也很高兴每个字段都能被复制,比如:xsl:copy of select=“country”,虽然不太复杂,但已经比我原来的xsltI好得多。我真的很喜欢你的帮助,希望有一天我能达到掌握和使用xslt 2的成熟度,我对你的答案投了赞成票,但作为旁注,我不想做任何复制。如果我在一个遥远的国家的同事们只是自己放入包装器元素,我根本不需要做任何xslt。使用直接复制来删除我的原始代码的2/3,而且非常容易阅读和自我解释,所以在这个场合我将坚持使用它。
<xsl:template match="xxx">
  <zzz>
    <xsl:apply-templates select="wrapper1"/>
    <wrapper2>
       <xsl:apply-templates select="*[not(self::wrapper1)]"/>
    </wrapper2>
  </zzz>
</xsl:template>
<xsl:template match="xxx">
  <zzz>
    <xsl:copy-of select="wrapper1" />
    <wrapper2>
      <xsl:copy-of select="city" />
      <xsl:copy-of select="state" />
      <xsl:copy-of select="postalCode" />
      <xsl:copy-of select="country" />
    </wrapper2>
  </zzz>
</xsl:template>