2016-05-16 4 views
0

У меня есть таблицы стилей XSLT со следующим шаблоном:XSLT шаблон не продуцирующие имена элементов правильно

<xsl:template match="row/*"> 
    <xsl:for-each select="."> 
     <saxon:assign name="count"><xsl:value-of select="$count+1" /></saxon:assign> 
     <xsl:variable name="node-value" as="xs:string" select="." /> 
     <xsl:variable name="node-name" as="xs:string"><xsl:value-of select="preceding::fielddescription/name(*[$count])" /></xsl:variable> 
     <xsl:variable name="current-node" as="xs:string"><xsl:value-of select="preceding::fielddescription/.[$count]" /></xsl:variable> 
     <xsl:if test=".[not(self::F2 or self::F7)]"> 
      <xsl:element name="{$current-node}"> 
       <xsl:value-of select="normalize-space(.)" /> 
      </xsl:element> 
     </xsl:if> 
     <xsl:if test=".[self::F2]"> 
      <UPCs> 
       <xsl:element name="{$current-node}"><xsl:value-of select="normalize-space(.)" /></xsl:element> 
      </UPCs> 
     </xsl:if> 
     <xsl:if test=".[self::F7]"> 
      <xsl:element name="{$current-node}"> 
       <xsl:value-of select="lower-case(normalize-space(replace(., '[/ ]', '-')))" /> 
      </xsl:element> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

То, что я хочу, чтобы это сделать, это процесс, каждый элемент дается в набор узлов, как это:

<fielddescription> 
    <F1>ExternalId</F1> 
    <F2>UPC</F2> 
    <F3>Name</F3> 
    <F4>Description</F4> 
    <F5>ProductPageUrl</F5> 
    <F6>ImageUrl</F6> 
    <F7>CategoryExternalId</F7> 
</fielddescription> 

и создавать новые элементы с именами тегов, соответствующими значениям каждого элемента в <fielddescription> за каждые <row> наборы стилей. Пока все мои таблицы стилей работают, за исключением этого шаблона; он продолжает создавать узлы с тэгами, которые являются полным именем последовательности:

<Product removed="false"> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>ED003-QCX</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <UPCs> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>031878025147</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    </UPCs> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>Sealy Naturals-Cotton Crib Mattress Pad</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>Give baby plush comfort from natural cotton fibers with the innovative Sealy Naturals-Cotton Crib Mattress Pad.</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>http://www.kolcraft.com/sealy-naturals-cotton-crib-mattress-pad.html</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>http://www.kolcraft.com/media/catalog/product/e/d/ed003-qcx-1_1_4.jpg</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>bedding-pads</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <Attributes> 
    <Attribute id="BV_FE_FAMILY"> 
     <Value>ED003</Value> 
    </Attribute> 
    <Attribute id="BV_FE_EXPAND"> 
     <Value>BV_FE_FAMILY:ED003</Value> 
    </Attribute> 
    </Attributes> 
</Product> 

Что такое мой шаблон, не так ли? Я также должен отметить, что я использовал функцию <saxon:assign>, потому что я не знал, как еще получить таблицу стилей для работы с переменной, которая будет обновляться ... Я знаю, что, вероятно, лучший способ сделать это с рекурсией, но я мог бы «Определите способ заставить его работать. Может ли кто-нибудь помочь?

+0

Переменная 'current-node' определяется как дочерний элемент группы' for-each' в начале шаблона: ' ' –

ответ

0

Просто используйте

<xsl:template match="row/F2"> 
    <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> 
    <xsl:variable name="node-name" as="xs:string" select="name(preceding::fielddescription/*[$pos])"/> 
      <UPCs> 
       <xsl:element name="{$node-name}"><xsl:value-of select="normalize-space(.)" /></xsl:element> 
      </UPCs> 
</xsl:template> 

<xsl:template match="row/F7"> 
    <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> 
    <xsl:variable name="node-name" as="xs:string" select="name(preceding::fielddescription/*[$pos])"/> 
      <xsl:element name="{$node-name}"> 
       <xsl:value-of select="lower-case(normalize-space(replace(., '[/ ]', '-')))" /> 
      </xsl:element> 
</xsl:template> 

<xsl:template match="row/*[not(self::F2 or self::F7)]"> 
    <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> 
    <xsl:variable name="node-name" as="xs:string" select="name(preceding::fielddescription/*[$pos])"/> 

      <xsl:element name="{$node-name}"> 
       <xsl:value-of select="normalize-space(.)" /> 
      </xsl:element> 


</xsl:template> 

В зависимости от того, где и как использовать применяемые-шаблоны в шаблонах элементов предка вы могли бы заменить <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> с <xsl:variable name="pos" select="position()"/>. Но нам нужно будет увидеть остальную часть кода.

+0

Ваше исправление работает. :) Спасибо! Я также нашел другое исправление для своей проблемы, я использовал 'name()' узлов ', а не' text() 'этих узлов. –