2016-05-06 132 views
1

我不完全知道在那里我的错误是目前我这里的样式表:不需要节点

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet exclude-result-prefixes="exsl xs" 
extension-element-prefixes="exsl" version="2.0" 
xmlns:exsl="http://exslt.org/common" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!--xsl:import-schema schema-location="ProductFeed5.6.xsd"/--> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" 
     byte-order-mark="no" omit-xml-declaration="no" 
     xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6" /> 

    <xsl:strip-space elements="*" /> 

    <!-- Parameter to determine when using 'contoursbaby' or 'kolcraft' feed 
     values --> 
    <xsl:param name="feedName" as="xs:string" /> 

    <!-- copy all nodes that do not match a given template --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
     <xsl:choose> 
      <xsl:when test="starts-with(name(), 'dataroot_')"> 
       <xsl:element name="Feed" namespace="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"> 
        <xsl:attribute name="name" select="$feedName" /> 
        <xsl:attribute name="incremental" select="'false'" /> 
        <xsl:attribute name="extractDate"><xsl:value-of select='current-dateTime()' /></xsl:attribute> 
        <xsl:if test="not(empty($feedName))"> 
         <xsl:choose> 
          <xsl:when test="$feedName eq 'kolcraft'"> 
           <xsl:copy-of select="exsl:node-set(document('kolcraft-brands.xml'))" /> 
           <xsl:copy-of select="exsl:node-set(document('kolcraft-categories.xml'))" /> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:value-of select="document('contours-categories.xml')" /> 
          </xsl:otherwise> 
         </xsl:choose> 
         <xsl:copy> 
          <xsl:apply-templates select="recordset" /> 
         </xsl:copy> 
        </xsl:if> 
       </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="recordset"> 
     <Products> 
      <xsl:for-each select="row"> 
       <Product> 
        <xsl:attribute name="removed" select="'false'" /> 
        <xsl:apply-templates select="@*|node()" /> 
       </Product> 
      </xsl:for-each> 
     </Products> 
    </xsl:template> 

    <xsl:template match="F1"> 
     <ExternalId><xsl:value-of select="." /></ExternalId> 
    </xsl:template> 

    <xsl:template match="F2"> 
     <UPCs> 
      <UPC><xsl:value-of select="." /></UPC> 
     </UPCs> 
    </xsl:template> 

    <xsl:template match="F3"> 
     <Name><xsl:value-of select="." /></Name> 
    </xsl:template> 

    <xsl:template match="F4"> 
     <Description><xsl:value-of select="." /></Description> 
    </xsl:template> 

    <xsl:template match="F5"> 
     <ProductPageUrl><xsl:value-of select="." /></ProductPageUrl> 
    </xsl:template> 

    <xsl:template match="F6"> 
     <ImageUrl><xsl:value-of select="." /></ImageUrl> 
    </xsl:template> 

    <xsl:template match="F7"> 
     <CategoryExternalId><xsl:value-of select="lower-case(normalize-space(replace(., '[/ ]', '-')))" /></CategoryExternalId> 
    </xsl:template> 

    <xsl:template match="fielddescription" /> 

</xsl:stylesheet> 

有我有2个问题,我不知道他们为什么会发生: 1. <Brands> & <Categories>被导入时会得到一个空的名称空间 2. <dataroot_r00295>继续显示为根<Feed>的第一个子项。

下面是其使用的那种源文件中的一个片段:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<dataroot_r00295> 

    <fielddescription> 
     <F1>ExternalID</F1> 
     <F2>UPC</F2> 
     <F3>Name</F3> 
     <F4>Description</F4> 
     <F5>ProductPageUrl</F5> 
     <F6>ProductImageUrl</F6> 
     <F7>CategoryExternalID</F7> 
    </fielddescription> 
    <recordset> 
    <row> 
      <F1>ED003-QCX</F1>  
      <F2>031878025147</F2>  
      <F3>Sealy Naturals-Cotton Crib Mattress Pad</F3>  
      <F4>Give baby plush comfort from natural cotton fibers with the innovative Sealy Naturals-Cotton Crib Mattress Pad.</F4>  
      <F5>http://www.kolcraft.com/sealy-naturals-cotton-crib-mattress-pad.html</F5>  
      <F6>http://www.kolcraft.com/media/catalog/product/e/d/ed003-qcx-1_1_4.jpg</F6>  
      <F7>Bedding/Pads</F7>  
    </row> 
    </recordset> 
</dataroot_r00295> 

下面是什么它会产生一个片段:

<?xml version="1.0" encoding="UTF-8"?> 
<Feed extractDate="2016-05-05T19:32:27.863-05:00" 
     incremental="false" 
     name="kolcraft" 
     xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"> 
     <Brands xmlns=""> 
      <Brand removed="false"> 
       <ExternalId>brands</ExternalId> 
       <Name>Brands</Name> 
       <!--BrandPageUrl>http://www.kolcraft.com/brands.html</BrandPageUrl --> 
      </Brand> 
     </Brands> 
     <Categories xmlns=""> 
      <Category removed="false"> 
       <ExternalId>baby-products</ExternalId> 
       <Name>Baby Products</Name> 
       <CategoryPageUrl>http://www.kolcraft.com/baby-products.html</CategoryPageUrl> 
      </Category> 
     </Categories> 
     <dataroot_r00295 xmlns=""> 
      <Products> 
       <Product removed="false"> 
        <ExternalId>ED003-QCX</ExternalId> 
        <UPCs> 
         <UPC>031878025147</UPC> 
        </UPCs> 
        <Name>Sealy Naturals-Cotton Crib Mattress Pad</Name> 
        <Description> 
         Give baby plush comfort from natural cotton fibers with the innovative Sealy Naturals-Cotton 
         Crib Mattress Pad. 
        </Description> 
        <ProductPageUrl>http://www.kolcraft.com/sealy-naturals-cotton-crib-mattress-pad.html</ProductPageUrl> 
        <ImageUrl>http://www.kolcraft.com/media/catalog/product/e/d/ed003-qcx-1_1_4.jpg</ImageUrl> 
        <CategoryExternalId>bedding-pads</CategoryExternalId> 
       </Product> 
      </Products> 
     </dataroot_r00295> 
</Feed> 

谁能解释这是怎么回事错在我的样式表?我很难过。

另外:如果还有其他方法可以更有效地使用模板,请随时教我使用XSLT的正确方法。

+0

您是拉从其他文档中的数据,我们无法在这里看到这有可能其中''和''派生出哪些没有像'' – Parfait

+0

这样的名称空间定义,我添加了这些文档包含的片段; ''和''是这些内含物的一部分。 –

回答

3

通常,如果要创建一个结果元素应该全部位于特定名称空间中的XML文档,那么正确方便的方法是将该名称空间的名称空间声明分别放在xsl:stylesheet根元素xsl:transform样式表的,在不同的模板创建即

<xsl:stylesheet 
    exclude-result-prefixes="exsl xs" 
    version="2.0" 
    xmlns:exsl="http://exslt.org/common" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"> 

这样,所有结果的要素将在该命名空间,即使你需要更改某个模板里面你可以再放入一个xmlns=""那里。

这样你就不应该出现xmlns="'',除非它们是由你复制的文档产生的。如果你从其他文档复制的那些元素不在命名空间中并且你希望它们在命名空间中http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6那么你不能复制它们,而是你必须使用例如<xsl:apply-templates select="document('foo.xml')/node()"/>,您可以设置用于创建命名空间中的元素模板,假设我早先提出的建议(与xmlns="..."xsl:stylesheet)就足够了具有

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 
+0

我确实得到了第二个问题,所以这解决了所有问题:)谢谢!我没有意识到这就是进口如何运作 –