2016-04-02 12 views
4

Bir düğümün (ref_name_1, ref_name_2, ref_name_3) bir metin içeriyorsa, xslt kullanarak karşılık gelen düğümü üretip atarız. öznitelikte örnek 1, 2 vb. Ben çözüm bulmaya çalıştım ama bununla ilgili bir şey bulamadım, hatta ufak bir yardım, oldukça takdir edilebilir olurdu.Her bir for için kullanmadan xslt 2.0 değişkenini artırın

Örnek XML

<?xml version="1.0" encoding="UTF-8"?> 
<reference> 
    <ref_name_1>reference1</ref_name_1> 
    <ref_company_1>company1</ref_company_1> 
    <ref_position_1>position3</ref_position_1> 
    <ref_name_2 /> 
    <ref_company_2>company2</ref_company_2> 
    <ref_position_2>position2</ref_position_2> 
    <ref_name_3>reference3</ref_name_3> 
    <ref_company_3>company3</ref_company_3> 
    <ref_position_3>position3</ref_position_3> 
</reference> 

Beklenen çıkışı:

<?xml version="1.0" encoding="UTF-8"?> 
<services> 
    <service name="reference" id="1"> 
     <name>reference1</name> 
     <company>company1</company> 
     <position>position1</position> 
    </service> 
    <service name="reference" id="2"> 
     <name>reference3</name> 
     <company>company3</company> 
     <position>position3</position> 
    </service> 
</services> 

cevap

3

anahtar position() fonksiyonudur. Bu <xsl:for-each> hem çalışır:

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

    <xsl:output indent="yes"/> 

    <xsl:template match="/reference"> 
    <services> 
     <xsl:for-each select="*[starts-with(local-name(), 'ref_name_')][. != '']"> 
     <xsl:variable name="originalNumber" select="substring-after(local-name(), 'ref_name_')"/> 

     <service name="reference" id="{position()}"> 
      <name> 
      <xsl:value-of select="."/> 
      </name> 
      <company> 
      <xsl:value-of select="following-sibling::*[local-name()=concat('ref_company_', $originalNumber)][1]"/> 
      </company> 
      <position> 
      <xsl:value-of select="following-sibling::*[local-name()=concat('ref_position_', $originalNumber)][1]"/> 
      </position> 
     </service> 
     </xsl:for-each> 
    </services> 
    </xsl:template> 

</xsl:stylesheet> 

yanı sıra <xsl:apply-tempaltes> ile

:

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

    <xsl:output indent="yes"/> 

    <xsl:template match="/reference"> 
    <services> 
     <xsl:apply-templates select="*[starts-with(local-name(), 'ref_name_')][. != '']"/> 
    </services> 
    </xsl:template> 


    <xsl:template match="*[starts-with(local-name(), 'ref_name_')][. != '']"> 
    <xsl:variable name="originalNumber" select="substring-after(local-name(), 'ref_name_')"/> 

    <service name="reference" id="{position()}"> 
     <name> 
     <xsl:value-of select="."/> 
     </name> 
     <company> 
     <xsl:value-of select="following-sibling::*[local-name()=concat('ref_company_', $originalNumber)][1]"/> 
     </company> 
     <position> 
     <xsl:value-of select="following-sibling::*[local-name()=concat('ref_position_', $originalNumber)][1]"/> 
     </position> 
    </service> </xsl:template> 

</xsl:stylesheet> 
+0

Teşekkürler Thomas, Beklendiği gibi çalışıyor. –

1

burada for-each-group group-starting-with ile birlikte kullanılır, aynı zamanda xsl:number vardır: http://xsltransform.net/ncdD7nm de

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

    <xsl:output indent="yes"/> 

    <xsl:template match="reference"> 
     <services> 
      <xsl:for-each-group select="*" group-starting-with="*[starts-with(local-name(), 'ref_name_')]"> 
       <xsl:if test="normalize-space()"> 
        <service name="reference"> 
         <xsl:attribute name="id"> 
          <xsl:number count="*[starts-with(local-name(), 'ref_name_') and normalize-space()]"/> 
         </xsl:attribute> 
         <xsl:apply-templates select="current-group()"/> 
        </service> 
       </xsl:if> 
      </xsl:for-each-group> 
     </services> 
    </xsl:template> 

    <xsl:template match="reference/*"> 
     <xsl:element name="{replace(local-name(), '^ref_|_[0-9]+$', '')}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 

</xsl:transform> 

Çevrimiçi.