使用XSLT构建XML文件以过滤多个子节点

时间:2017-07-25 14:54:04

标签: xml xslt ssis

我有一个来自ICECAT的大型xml文件。我只想要一些信息。这是本主题的以下内容filter-dynamically-xml-child-element-with-xslt-with-ssis

现在我有一个categoriesList XML文件,如下所示:

<ICECAT-interface>
<Response Date="Tue Jul 25 16:00:10 2017" ID="29306604" Request_ID="1500991209" Status="1">
<CategoriesList>
  <Category ID="2597" LowPic="http://images.icecat.biz/img/low_pic/2597-5095.jpg" Score="471102" Searchable="0" ThumbPic="http://images.icecat.biz/thumbs/CAT2597.jpg" UNCATID="43223323" Visible="0">
    <Name ID="1088701" Value="fiber optic adapters" langid="1"/>
    <Name ID="1595015" Value="glasvezeladapters" langid="2"/>
    <Name ID="1088703" Value="adaptateurs de fibres optiques" langid="3"/>
    <Name ID="1245208" Value="LWL-Steckverbinder" langid="4"/>
    <Name ID="1088705" Value="adattatori di fibra ottica" langid="5"/>
    <Name ID="1125574" Value="adaptadores de fibra óptica" langid="6"/>
    <Name ID="1147616" Value="lyslederadapter" langid="7"/>

   <ParentCategory ID="242">
    <Names>
      <Name ID="485" langid="1">networking</Name>
      <Name ID="471244" langid="2">netwerken</Name>
      <Name ID="343986" langid="3">réseaux</Name>
      <Name ID="436999" langid="4">Netzwerke</Name>
      <Name ID="1051724" langid="5">reti</Name>
      <Name ID="1041258" langid="6">redes</Name>
      <Name ID="34261" langid="7">netværk</Name>
      <Name ID="530435" langid="8">сети/коммуникации</Name>

    </Names>
   </ParentCategory>
  </Category>
  <Category ID="4601" LowPic="http://images.icecat.biz/img/low_pic/4601-990.jpg" Score="12621" Searchable="0" ThumbPic="http://images.icecat.biz/thumbs/CAT4601.jpg" UNCATID="56101688" Visible="0">

我需要Category节点中的某些属性,例如IDLowPic ...某些Name节点和ID节点中的ParentCategory

我试过这个XSLT:

<?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="CategoriesList"/>
    </xsl:template>

    <xsl:template match="CategoriesList">
        <xsl:copy>
            <xsl:apply-templates select="Category"/>
        </xsl:copy>
    </xsl:template>

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

    <xsl:template match="Name[@langid=1 or @langid=3]">
        <Category>
            <xsl:copy-of select="../@ID|../@LowPic|../@ThumbPic|../@UNCATID||@langid|@Value" />
        </Category>
    </xsl:template>        
</xsl:stylesheet>

我不知道这是否是更好的方法,而且我没有ID节点的ParentCategory

更新 对不起,我忘记了我想要的结果

<?xml version="1.0" encoding="utf-8"?>
<Categories>
<Category ID="2597" LowPic="http://images.icecat.biz/img/low_pic/2597-5095.jpg" ThumbPic="http://images.icecat.biz/thumbs/CAT2597.jpg" UNCATID="43223323" name="fiber optic adapters" langid="1" ParentCategory="242"/>
  <Category ID="2597" LowPic="http://images.icecat.biz/img/low_pic/2597-5095.jpg" ThumbPic="http://images.icecat.biz/thumbs/CAT2597.jpg" UNCATID="43223323" name="adaptateurs de fibres optiques" langid="3" ParentCategory="242"/>
 ....

更新2 我修改了XSLT文件,我反过来我的过滤器位置。现在我有货物记录,只是父类别id的湖泊

1 个答案:

答案 0 :(得分:1)

看起来您希望为每个Category输出Name langid属性为1或3.在这种情况下,您需要将条件移至{{1 }}

xsl:apply-templates

然后,在匹配<xsl:template match="Category"> <xsl:apply-templates select="Name[@langid=1 or @langid=3]"/> </xsl:template> 的模板中,您可以像这样为ParentCategoryId创建一个属性

Name

同样适用于 <xsl:attribute name="ParentCategoryId"> <xsl:value-of select="following-sibling::ParentCategory[1]/@ID" /> </xsl:attribute> 属性。

试试这个XSLT

Name

注意,您可以使用属性值模板

简化<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="CategoriesList"/> </xsl:template> <xsl:template match="CategoriesList"> <xsl:copy> <xsl:apply-templates select="Category"/> </xsl:copy> </xsl:template> <xsl:template match="Category"> <xsl:apply-templates select="Name[@langid=1 or @langid=3]"/> </xsl:template> <xsl:template match="Name"> <Category> <xsl:copy-of select="../@ID|../@LowPic|../@ThumbPic|../@UNCATID|@langid" /> <xsl:attribute name="Name"> <xsl:value-of select="@Value" /> </xsl:attribute> <xsl:attribute name="ParentCategoryId"> <xsl:value-of select="following-sibling::ParentCategory[1]/@ID" /> </xsl:attribute> </Category> </xsl:template> </xsl:stylesheet> 模板
Name