2014-07-18 2 views
2

je le XML d'entrée en tantXSLT pour XML Filtrage du groupe répétitif

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<document> 
<item> 
<functionalName lang="en">Filte</functionalName> 
<functionalName lang="hin">test1</functionalName> 
<functionalName lang="chi">Filters2</functionalName> 
<functionalName lang="hin">Filters3</functionalName> 
</item> 
<item> 
<functionalName lang="en">Filte</functionalName> 
<functionalName lang="chi">Filters</functionalName> 
<functionalName lang="en">Filters1</functionalName> 
</item> 

et la sortie désirée après l'analyse par l'intermédiaire du XSLT est mentionné ci-dessous XSLT est mentionné à la fin de la requête XML de sortie:

<?xml version="1.0" encoding="UTF-8"?> 
<CatalogItem> 
<RelationshipData> 
    <Relationship> 
     <RelationType>Descriptions_for_Item</RelationType> 
     <RelatedItems count="3"> 
      <RelatedItem1 referenceKey="ITEM_DESCRIPTION-functionalName-en" /> 
      <RelatedItem1 referenceKey="ITEM_DESCRIPTION-functionalName-hin" /> 
      <RelatedItem1 referenceKey="ITEM_DESCRIPTION-functionalName-chi" /> 
     </RelatedItems> 
    </Relationship> 
</RelationshipData> 
<RelationshipData> 
    <Relationship> 
     <RelationType>Descriptions_for_Item</RelationType> 
     <RelatedItems count="2"> 
      <RelatedItem1 referenceKey="ITEM_DESCRIPTION-functionalName-en" /> 
      <RelatedItem1 referenceKey="ITEM_DESCRIPTION-functionalName-chi" /> 
     </RelatedItems> 
    </Relationship> 
</RelationshipData> 

XSLT que j'utilise ne me donne pas la réponse désirée. S'il vous plaît aider

<xsl:output method="xml" indent="yes" /> 

<xsl:key name="functional" match="functionalName" use="@lang" /> 

<xsl:template match="document"> 
    <CatalogItem> 
     <xsl:for-each select="item"> 
      <RelationshipData> 
       <Relationship> 
        <RelationType>Descriptions_for_Item</RelationType> 

        <RelatedItems> 
         <xsl:attribute name="count"> 
          <xsl:value-of select="count(functionalName[generate-id(.)=generate-id(key('functional',@lang)[1])])"/>   
         </xsl:attribute> 
         <xsl:apply-templates select="functionalName[generate-id(.)=generate-id(key('functional',@lang)[1])]"/> 
        </RelatedItems> 
       </Relationship> 
      </RelationshipData> 
     </xsl:for-each> 
    </CatalogItem> 
</xsl:template> 


<xsl:template match="functionalName"> 
    <xsl:for-each value="{@lang}"> 
     <xsl:variable name="language" select="../@lang" />    
     <RelatedItem1> 
      <xsl:attribute name="referenceKey"> 
       <xsl:value-of select="concat('ITEM_DESCRIPTION','-','functionalName','-',../@lang)"/> 
      </xsl:attribute> 
     </RelatedItem1> 
    </xsl:for-each> 
</xsl:template> 

Répondre

0

Modifier votre clé de

<xsl:key name="functional" match="functionalName" use="@lang" /> 

à

<xsl:key name="functional" match="functionalName" use="concat(generate-id(..), '|', @lang)" /> 

vous pouvez utiliser

<RelatedItems count="{count(functionalName[generate-id() = generate-id(key('functional', concat(generate-id(..), '|', @lang))[1])])}"> 

et

<xsl:apply-templates select="functionalName[generate-id() = generate-id(key('functional', concat(generate-id(..), '|', @lang))[1])]"/> 

et enfin vous pouvez simplifier le modèle pour functionaName à

<xsl:template match="functionalName">    
     <RelatedItem1 referenceKey="{concat('ITEM_DESCRIPTION','-','functionalName','-', @lang)}"/> 
</xsl:template> 

Ainsi les échantillons complets est

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes"/> 

<xsl:key name="functional" match="functionalName" use="concat(generate-id(..), '|', @lang)" /> 

<xsl:template match="document"> 
    <CatalogItem> 
     <xsl:for-each select="item"> 
      <RelationshipData> 
       <Relationship> 
        <RelationType>Descriptions_for_Item</RelationType> 
         <RelatedItems count="{count(functionalName[generate-id() = generate-id(key('functional', concat(generate-id(..), '|', @lang))[1])])}"> 
          <xsl:apply-templates select="functionalName[generate-id() = generate-id(key('functional', concat(generate-id(..), '|', @lang))[1])]"/> 
         </RelatedItems> 
       </Relationship> 
      </RelationshipData> 
     </xsl:for-each> 
    </CatalogItem> 
</xsl:template> 


<xsl:template match="functionalName">    
     <RelatedItem1 referenceKey="{concat('ITEM_DESCRIPTION','-','functionalName','-', @lang)}"/> 
</xsl:template> 

</xsl:stylesheet>