-1

我一直在寻找一个好的文档来解释这一点,但没有成功。这是我的问题:

这是我的要求

  • 根元素必须更改名称(已完成),
  • 应该将第二级元素中的一个属性名称转换为新元素。
  • 应删除二级元素及其其余属性
  • 第三级元素(第二级元素内部)中的所有属性都转换为第二级元素。
  • 应删除第三级元素。

当前的

<list>

<type name="drum" acustic="true" pieces="5" >
    <part name="pearl" id="0" version="0" displayOrder="0" customizationLevel="basic" />
    <part name="dw" id="1" version="0" displayOrder="0" customizationLevel="basic" />
</type>

<type name="guitar" acustic="true" pieces="1" >
    <part name="fender" id="0" version="0" displayOrder="0" customizationLevel="basic" />       
</type>

想要的

<instrumentList>
    <instrument>
    <instrumentType>drum</instrumentType>
    <instrumentID>0</instrumentID>
    <instrumentBrand>pearl</instrumentBrand>
    <version>0</version>
    <displayOrder>0</displayOrder>
    <customizationLevel>basic</customizationLevel>
    </instrument>

    <intrument>
    <instrumentType>drum</instrumentType>
    <instrumentID>1</instrumentID>
    <instrumentBrand>dw</instrumentBrand>
    <version>0</version>
    <displayOrder>0</displayOrder>
    <customizationLevel>basic</customizationLevel>
    </instrument>
    <instrument>    
    <instrumentType>guitar</instrumentType>
    <instrumentID>0</instrumentID>
    <instrumentBrand>fender</instrumentBrand>
    <version>0</version>
    <displayOrder>0</displayOrder>
    <customizationLevel>basic</customizationLevel>
    </instrument>
</instrumentList>

所以我按照下面的教程和线程没有成功 线程 1 线程 2

我可以做一部分,但不是全部。我确定这里有些东西我不理解,尤其是删除元素和创建新元素以及使用一些属性,而不是全部。即使有人可以向我指出一个很好的参考资料,我可以理解 xslt 如何解析 xml,所以我可以有一个更好的主意,因为我发现的所有示例都转换了每个属性或元素,不幸的是,这不是我的情况。

任何帮助将不胜感激

4

1 回答 1

1

好吧,您将从拥有将属性转换为元素的通用模板开始,如下所示:

<xsl:template match="@*">
   <xsl:element name="{local-name()}">
      <xsl:value-of select="."/>
   </xsl:element>
</xsl:template>

但是看看你的需求,某些属性需要重命名为元素,所以你会为这些编写特定的模板。例如,@id元素看起来要重命名为InstrumentId

<xsl:template match="@id">
   <instrumentID>
      <xsl:value-of select="."/>
   </instrumentID>
</xsl:template>

唯一需要做的一点额外工作是使用与part元素匹配的模板,您需要输出一个instrumentType元素,其值等于父属性。除此之外,您只需要选择所有要转换的属性元素

<xsl:template match="part">
   <instrumentType>
      <xsl:value-of select="../@name"/>
   </instrumentType>
   <xsl:apply-templates select="@*"/>
</xsl:template>

对于二级类型元素,您可以让 XSLT 的内置模板处理它。

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="list">
      <instrument>
         <xsl:apply-templates/>
      </instrument>
   </xsl:template>

   <xsl:template match="part">
      <instrumentType>
         <xsl:value-of select="../@name"/>
      </instrumentType>
      <xsl:apply-templates select="@*"/>
   </xsl:template>

   <xsl:template match="@id">
      <instrumentID>
         <xsl:value-of select="."/>
      </instrumentID>
   </xsl:template>

   <xsl:template match="@name">
      <instrumentBrand>
         <xsl:value-of select="."/>
      </instrumentBrand>
   </xsl:template>

   <xsl:template match="@*">
      <xsl:element name="{local-name()}">
         <xsl:value-of select="."/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

当应用于您的 XML(假设一个结束列表标记)时,输出以下内容

<instrument>
   <instrumentType>drum</instrumentType>
   <instrumentBrand>pearl</instrumentBrand>
   <instrumentID>0</instrumentID>
   <version>0</version>
   <displayOrder>0</displayOrder>
   <customizationLevel>basic</customizationLevel>

   <instrumentType>drum</instrumentType>
   <instrumentBrand>dw</instrumentBrand>
   <instrumentID>1</instrumentID>
   <version>0</version>
   <displayOrder>0</displayOrder>
   <customizationLevel>basic</customizationLevel>

   <instrumentType>guitar</instrumentType>
   <instrumentBrand>fender</instrumentBrand>
   <instrumentID>0</instrumentID>
   <version>0</version>
   <displayOrder>0</displayOrder>
   <customizationLevel>basic</customizationLevel>
</instrument>
于 2013-05-31T22:51:27.507 回答