如何使用xslt转换xml文档以根据子节点复制输出行 [英] how transform xml document with xslt to duplicate output lines according to the child node

查看:19
本文介绍了如何使用xslt转换xml文档以根据子节点复制输出行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我致力于使用 SSIS 包提取 Icecat xml 文件的信息.

I worked on extracting information of Icecat xml files with SSIS package.

<?xml version="1.0" encoding="UTF-8"?>
<ICECAT-interface>
<Response Date="Tue Jun 27 16:00:01 2017" ID="0" Request_ID="1498572001" 
Status="1">
<SuppliersList>
  <Supplier ID="1" LogoPic="http://images.icecat.biz/img/brand/thumb/1_91e0e5b25690437cb026012c624a00ad.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="10201" LogoLowPic="http://images.icecat.biz/img/brand/low/1_577ba75b274e4917bf27f4ff5fc609be.jpg" LogoLowPicHeight="200" LogoLowPicWidth="200" LogoLowSize="31058" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="http://images.icecat.biz/img/brand/high/1_43ebe562b309447dbbf377fd5adf41e3.jpg" LogoHighPicHeight="200" LogoHighPicWidth="200" LogoHighPicSize="31058" LogoOriginal="http://images.icecat.biz/img/brand/original/1_9a451c84f85c44d78ae79a1712706fe9.jpg" LogoOriginalSize="31133" Name="HP" Sponsor="1">
    <Names>
      <Name langid="12" Name="惠普" />
    </Names>
  </Supplier>
  <Supplier ID="2" LogoPic="http://images.icecat.biz/img/brand/thumb/2_b4222cd1f4ef41a79d452c7d47d9b8a8.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="3668" LogoLowPic="http://images.icecat.biz/img/brand/low/2_7a45daa4e872400c8037f0e4231a7cb4.jpg" LogoLowPicHeight="53" LogoLowPicWidth="200" LogoLowSize="13241" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="http://images.icecat.biz/img/brand/high/2_286ef5dd29ca4941be0b9de27f041b4b.jpg" LogoHighPicHeight="53" LogoHighPicWidth="200" LogoHighPicSize="13241" LogoOriginal="http://images.icecat.biz/img/brand/original/2_093830b1b15a4eb8b38425d64ba80e9d.jpg" LogoOriginalSize="37929" Name="Toshiba" Sponsor="1" />
  <Supplier ID="3" LogoPic="http://images.icecat.biz/img/brand/thumb/3_d2375bf6ef1d47269cd01fa902a13788.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="3382" LogoLowPic="http://images.icecat.biz/img/brand/low/3_d05e0e4693d34b85ad56c94404338662.jpg" LogoLowPicHeight="76" LogoLowPicWidth="200" LogoLowSize="9156" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="http://images.icecat.biz/img/brand/high/3_a4caad745868496ea1ee4e6c0df57585.jpg" LogoHighPicHeight="76" LogoHighPicWidth="200" LogoHighPicSize="9156" LogoOriginal="http://images.icecat.biz/img/brand/original/3_b5bc53009d974136ba7048b8e2d9e8b4.jpg" LogoOriginalSize="37257" Name="IBM" Sponsor="1" />
  <Supplier ID="5" LogoPic="http://images.icecat.biz/img/brand/thumb/5_1cf5d422c33b47159d29120556249309.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="1916" LogoLowPic="http://images.icecat.biz/img/brand/low/5_a028484b02804360a3b2a3d6f1635439.jpg" LogoLowPicHeight="43" LogoLowPicWidth="200" LogoLowSize="6322" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="http://images.icecat.biz/img/brand/high/5_5666d3e455e34cdea7572e6ab5a4e38e.jpg" LogoHighPicHeight="43" LogoHighPicWidth="200" LogoHighPicSize="6322" LogoOriginal="http://images.icecat.biz/img/brand/original/5_b1c151c0bacf4360b4eb9161b71ea8a4.jpg" LogoOriginalSize="6510" Name="Sony" Sponsor="1" />
  <Supplier ID="6" LogoPic="http://images.icecat.biz/img/brand/thumb/6_bed73021a8fc496a8386b3c9276f0216.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="3111" LogoLowPic="http://images.icecat.biz/img/brand/low/6_8dae0e5b024145aa82c5c229048240e8.jpg" LogoLowPicHeight="117" LogoLowPicWidth="200" LogoLowSize="11196" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="http://images.icecat.biz/img/brand/high/6_53e052f2b7594a4e9f3950081dfe143d.jpg" LogoHighPicHeight="117" LogoHighPicWidth="200" LogoHighPicSize="11196" LogoOriginal="http://images.icecat.biz/img/brand/original/6_f4b347ab7d2e4ab88f84d8e04ccfe966.jpg" LogoOriginalSize="24384" Name="3com" />
  <Supplier ID="7" LogoPic="http://images.icecat.biz/img/brand/thumb/7_2e1091176d2d450eae2dce7506f1952f.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="3583" LogoLowPic="http://images.icecat.biz/img/brand/low/7_5760a89b29ab45aeae95ae639c247b3a.jpg" LogoLowPicHeight="89" LogoLowPicWidth="200" LogoLowSize="11942" LogoMediumPic="http://images.icecat.biz/img/brand/medium/7_ce2e94986d1847568b47a2d488d374fd.jpg" LogoMediumPicHeight="222" LogoMediumPicWidth="500" LogoMediumPicSize="31489" LogoHighPic="http://images.icecat.biz/img/brand/high/7_faa735acc8b7487093b094c1440cc91d.jpg" LogoHighPicHeight="1336" LogoHighPicWidth="2999" LogoHighPicSize="241523" LogoOriginal="http://images.icecat.biz/img/brand/original/7_6a89e510401c47d894ad4bb6188cc65a.jpg" LogoOriginalSize="442120" Name="Acer" Sponsor="1">
    <Names>
      <Name langid="12" Name="宏碁" />
    </Names>
  </Supplier>
  <Supplier ID="8" LogoPic="http://images.icecat.biz/img/brand/thumb/8_d489e504070b40e886b6456a0a7beb99.jpg" LogoPicHeight="75" LogoPicWidth="75" LogoPicSize="6122" LogoLowPic="http://images.icecat.biz/img/brand/low/8_d5179e6b3bb14bf889d5bf56e2ed42e3.jpg" LogoLowPicHeight="200" LogoLowPicWidth="158" LogoLowSize="20437" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="http://images.icecat.biz/img/brand/high/8_e7673fd830a04b2fa8f655bb58dad630.jpg" LogoHighPicHeight="252" LogoHighPicWidth="200" LogoHighPicSize="25045" LogoOriginal="http://images.icecat.biz/img/brand/original/8_a711999f9d3a4c8fb35fec28f22d4dbf.jpg" LogoOriginalSize="46934" Name="Adobe" />
  <Supplier ID="9" LogoPic="" LogoPicHeight="0" LogoPicWidth="0" LogoPicSize="0" LogoLowPic="" LogoLowPicHeight="0" LogoLowPicWidth="0" LogoLowSize="0" LogoMediumPic="" LogoMediumPicHeight="0" LogoMediumPicWidth="0" LogoMediumPicSize="0" LogoHighPic="" LogoHighPicHeight="0" LogoHighPicWidth="0" LogoHighPicSize="0" LogoOriginal="" LogoOriginalSize="0" Name="Apple">
    <Names>
      <Name langid="12" Name="苹果" />
    </Names>
  </Supplier>
 ....

就像你有时看到的那样,我有供应商名称,如属性(这是供应商的国际名称 langid=1=english)但有时我有子节点名称"作为特殊语言的名称,如中文...

Like u see some times I've Name of supplier like attibutes (it's the internationnal name of supplier langid=1=english) but sometimes I've child nodes "Names" for name in special language like chinese...

当我有这样的子节点时,我想创建一个带有在线名称和 LangId 属性的新 xml 文件:

I want create a new xml file with on line Name and LangId attibutes duplicating lines when I've child node likes this:

  <Supplier ID="1" LogoLowPic="http://images.icecat.biz/img/brand/low/1_577ba75b274e4917bf27f4ff5fc609be.jpg" Name="HP" langid="1"></Supplier>
    <Supplier ID="1" LogoLowPic="http://images.icecat.biz/img/brand/low/1_577ba75b274e4917bf27f4ff5fc609be.jpg" Name="惠普" langid="12"></Supplier>
    <Supplier ID="2"  LogoLowPic="http://images.icecat.biz/img/brand/low/2_7a45daa4e872400c8037f0e4231a7cb4.jpg"  Name="Toshiba" langid="1"></Supplier>

这是我的尝试,但结果不是很好.

Here my try, but It's not the good result.

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

<xsl:template match="/ICECAT-interface">
    <xsl:apply-templates select="Response"/>
</xsl:template>

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

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

<xsl:template match="Supplier">
    <xsl:element name="Supplier">
        <xsl:attribute name="ID">
            <xsl:value-of select="@ID"/>
        </xsl:attribute>
        <xsl:attribute name="LogoLowPic">
            <xsl:value-of select="@LogoLowPic"/>
        </xsl:attribute>
        <xsl:attribute name="Name">
            <xsl:value-of select="@Name"/>
        </xsl:attribute>
        <xsl:attribute name="langid">
            <xsl:value-of select="1"/>
        </xsl:attribute>
        <xsl:apply-templates select="Names"/>
    </xsl:element>
</xsl:template>
 <xsl:template match="Names">
    <xsl:element name="Name">
        <xsl:attribute name="Name">
            <xsl:value-of select="@Name"/>
        </xsl:attribute>
        <xsl:attribute name="langid">
            <xsl:value-of select="@langid"/>
        </xsl:attribute>
    </xsl:element>
 </xsl:template>
</xsl:stylesheet>

感谢您的帮助.

推荐答案

您需要做的一件事是将 <xsl:apply-templates select="Names"/> 移动到在复制 Supplier 元素之后,而不是在其中,因此您创建了一个兄弟元素,而不是一个子元素.

One thing you need to do is move the <xsl:apply-templates select="Names"/> to be after copying of the Supplier element, rather than in it, so you create a sibling, rather than a child.

如果您选择Names/Name 而不是Name,也会更容易.

It would also be easier if you selected Names/Name rather than just Name.

试试这个 XSLT...

Try this XSLT...

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

<xsl:template match="/ICECAT-interface">
    <xsl:apply-templates select="Response"/>
</xsl:template>

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

<xsl:template match="SuppliersList">
  <xsl:copy>
    <xsl:apply-templates select="Supplier"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Supplier">
    <Supplier>
      <xsl:copy-of select="@ID|@LogoLowPic|@Name"/>
      <xsl:attribute name="langid">
          <xsl:value-of select="1"/>
      </xsl:attribute>
  </Supplier>
  <xsl:apply-templates select="Names/Name"/>
</xsl:template>

<xsl:template match="Name">
  <Supplier>
    <xsl:copy-of select="../../@ID|../../@LogoLowPic" />
    <xsl:copy-of select="@Name|@langid" />
  </Supplier>
 </xsl:template>
</xsl:stylesheet>

注意我如何使用 xsl:copy-of 来简化属性的复制.或者,您可以在此处使用属性值模板.例如,Name 模板可以这样写.

Note how I have used xsl:copy-of to simplify the copying of attributes. Alternatively, you can make use of Attribute Value Templates here. For example, the Name template can be written like this.

<xsl:template match="Name">
  <Supplier ID="{../../@ID}">
    <xsl:copy-of select="@Name|@langid" />
  </Supplier>
 </xsl:template>

这篇关于如何使用xslt转换xml文档以根据子节点复制输出行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆