XSLT - 用另一个元素覆盖一个元素

时间:2017-04-19 16:41:07

标签: xml xslt xpath

我有一个XML,我基本上只需要将一个元素复制到另一个元素上。

<sitecore>
  <phrase path="/content/Bootcamper/Data/Forms/Contact" key="Contact" itemid="{1EDC7BBB-2194-4B0E-A031-F0383F60664D}" fieldid="Name" updated="20170410T131336Z">
    <de-CH>Absenden</de-CH>
    <fr-CH>Submit</fr-CH>
    <en>Submit</en>
  </phrase>
  <phrase path="/content/Bootcamper/Data/Forms/Contact/unknown section/Vorname" key="Vorname" itemid="{9D561751-5B89-4B90-A93F-383A591202DE}" fieldid="Title" updated="20170410T123903Z">
    <de-CH>Vorname</de-CH>
    <en>Firstname</en>
  </phrase>
</sitecore>

我需要的是类似的XML,但<de-CH>内的<fr-CH>内容。 <en>始终被移除。如果<fr-CH>不存在,则应创建它。

<sitecore>
  <phrase path="/content/Bootcamper/Data/Forms/Contact" key="Contact" itemid="{1EDC7BBB-2194-4B0E-A031-F0383F60664D}" fieldid="Name" updated="20170410T131336Z">
    <de-CH>Absenden</de-CH>
    <fr-CH>Absenden</fr-CH>
  </phrase>
  <phrase path="/content/Bootcamper/Data/Forms/Contact/unknown section/Vorname" key="Vorname" itemid="{9D561751-5B89-4B90-A93F-383A591202DE}" fieldid="Title" updated="20170410T123903Z">
    <de-CH>Vorname</de-CH>
    <fr-CH>Vorname</fr-CH>
  </phrase>
</sitecore>

我设法复制了<de-CH>并删除了<en>标记。但现在我必须将<de-CH>复制到新的(或现有的)<fr-CH>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="en|fr-CH"/> <!-- this empty template will remove them -->                  
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

如果总会有de-CH个节点存在,一种方法是使用一个匹配de-CH的模板复制它,同时也添加fr-CH节点

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8" indent="no"/>

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="en|fr-CH"/>

  <xsl:template match="de-CH">
    <xsl:copy-of select="." />
    <fr-CH>
      <xsl:value-of select="." />
    </fr-CH>
  </xsl:template>
</xsl:stylesheet>