首页 > 解决方案 > XSLT - 克隆 XML 过滤掉数组元素

问题描述

我有一个 XML 结构,我需要删除数组的所有元素,除了最后一个保持完全相同的结构。我需要使用 XSLT 转换来实现这一点。该结构由几个嵌套数组组成。最后一个是一组“价值观”,除了最后一个我不感兴趣。这就是为什么我需要删除“属性”元素下的所有“值”元素,除了最后一个元素。我不是 XSL 转换方面的专家,因此将不胜感激。

原始 XML:

<?xml version="1.0" encoding="UTF-8"?>
    <Data xmlns="http://schemas.myorg.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Schema="RSXML4.5" xsi:schemaLocation="http://schemas.myorg.com/RSXml4.5.xsd">
   <Entities Name="Delta Export">
      <Entity Id="15273739" Name="Entity1">
         <Attributes>
            <Attribute Id="4012" Name="Height">
               <Values>
                  <Value Id="169384125" Action="NoChange">91</Value>
               </Values>
            </Attribute>
            <Attribute Id="4148" Name="Channel">
               <Values>
                  <Value Id="169384649" Action="NoChange">USA</Value>
                  <Value Id="169384652" Action="NoChange">BLR</Value>
               </Values>
            </Attribute>
         </Attributes>
         <Relationships />
      </Entity>
      <Entity Id="15279499" LongName="Entity2">
         <Attributes>
            <Attribute Id="4097" Name="Long Description">
               <Values>
                  <Value Id="169384290" Action="NoChange">Kentucky</Value>
               </Values>
            </Attribute>
            <Attribute Id="4098" Name="Short Description">
               <Values>
                  <Value Id="169384297" Action="NoChange">Kent</Value>
                  <Value Id="169384298" Action="NoChange">Kent</Value>
               </Values>
            </Attribute>
         </Attributes>
      </Entity>
   </Entities>
</Data>

预期的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://schemas.myorg.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Schema="RSXML4.5" xsi:schemaLocation="http://schemas.myorg.com/RSXml4.5.xsd">
   <Entities Name="Delta Export">
      <Entity Id="15273739" Name="Entity1">
         <Attributes>
            <Attribute Id="4012" Name="Height">
               <Values>
                  <Value Id="169384125" Action="NoChange">91</Value>
               </Values>
            </Attribute>
            <Attribute Id="4148" Name="Channel">
               <Values>
                  <Value Id="169384652" Action="NoChange">BLR</Value>
               </Values>
            </Attribute>
         </Attributes>
         <Relationships />
      </Entity>
      <Entity Id="15279499" LongName="Entity2">
         <Attributes>
            <Attribute Id="4097" Name="Long Description">
               <Values>
                  <Value Id="169384290" Action="NoChange">Kentucky</Value>
               </Values>
            </Attribute>
            <Attribute Id="4098" Name="Short Description">
               <Values>
                  <Value Id="169384298" Action="NoChange">Kent</Value>
               </Values>
            </Attribute>
         </Attributes>
      </Entity>
   </Entities>
</Data>

谢谢

标签: xmlxslt

解决方案


你知道如何应用 xslt 吗?如果是这样,试试这个:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/">
    <xsl:apply-templates select="*" />
</xsl:template>


<xsl:template match="@*|*">
    <xsl:copy>
        <xsl:apply-templates select="@*|*[name()!='Value' or position()=last()]"/>
        <xsl:value-of select="text()" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

推荐阅读