2016-03-23 4 views
0

Kodumla, tek bir sınırsız öğeye birden fazla girdi eşleştirmemiz gereken farklı bir gereksinim var. Aşağıda verilen örnek verilmiştir.XSLT Tek bir sınırsız öğeye çoklu girdiyi dönüştürme

Birisi bunun için lütfen yardımcı olabilir.

Kaynak Sistemi XSD haritalama şimdi burada

<Errors> 
<error> 
<errorcode>code</errorcode> 
<errortype>type</errortype> 
<errorParameters> 
    <errorPara>error1</errorPara> 
    <errorPara>error2</errorPara> 
    <errorPara>error3</errorPara> 
    <errorPara>error4</errorPara> 
</errorParameters> 
</error> 
</Errors> 

errorPara gibi formatının olduğu hedef xsd bu değerleri eşlemek zorunda olduğu

doğada sınırsız olduğu

<Errors> 
<error> 
<errorcode>code</errorcode> 
<errortype>type</errortype> 
<paramater1>error1</paramater1> 
<paramater2>error2</paramater2> 
<paramater3/>error3</paramater3> 
<paramater4/>error4</paramater4> 
<error> 
<Errors> 
errorParameters öğesinin içinde yer alır.

Bu

+0

XSLT, desen/normal ifade ile düğümü seçemez. üzerinde. Parametre1, parameter2, ... parametresi N sınırsız ... Eğer hata kodu, errortype ve parametre * yanı sıra başka bir çocuk hata etiketi var mı? –

+0

@KenCheung - Cevabınız için teşekkür ederiz. Hayır, doğuştan gelen hatada sınırsız olarak herhangi bir alt etiketi yok. dizi veya döngü kullanarak herhangi bir inbuild fonksiyonumuz var mı? Bu başarılabilir. – kumarb

+0

@kumarb http://stackoverflow.com/help/someone-answers –

cevap

0

Tamam, hata yalnızca hatakodu, errortype çocuğunu ve parameterN sahip yalnızca

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <!--Suppress unmatched text--> 
    <xsl:template match="text()" /> 

    <xsl:template match="/"> 
    <Errors><error> 
     <errorcode><xsl:apply-templates select="Errors/error/errorcode"/></errorcode> 
     <errortype><xsl:apply-templates select="Errors/error/errortype"/></errortype> 
     <errorParameters> 
      <xsl:for-each select="Errors/error/*"> 
       <xsl:choose> 
        <xsl:when test="name() = 'errorcode'"></xsl:when> 
        <xsl:when test="name() = 'errortype'"></xsl:when> 
        <xsl:otherwise><errorPara><xsl:value-of select="normalize-space(.)"/></errorPara></xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </errorParameters> 
    </error></Errors> 
    </xsl:template> 

    <xsl:template match="errorcode"> 
     <xsl:value-of select="normalize-space(.)"/> 
    </xsl:template> 

    <xsl:template match="errortype"> 
     <xsl:value-of select="normalize-space(.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

ben soru üzerine veri xml olduğunu düşünüyorum XSLT 1.0 kullanarak nasıl gerçekleştirilebileceği merak ediyorum bazı yazım onları değiştirmek var bu yüzden:

<Errors> 
<error> 
<errorcode>code</errorcode> 
<errortype>type</errortype> 
<parameter1>error1</parameter1> 
<parameter2>error2</parameter2> 
<parameter3>error3</parameter3> 
<parameter4>error4</parameter4> 
</error> 
</Errors> 

Ardından sonucu (Linux: xsltproc test.xslt data.xml | xmllint --format -):

<?xml version="1.0"?> 
<Errors> 
    <error> 
    <errorcode>code</errorcode> 
    <errortype>type</errortype> 
    <errorParameters> 
     <errorPara>error1</errorPara> 
     <errorPara>error2</errorPara> 
     <errorPara>error3</errorPara> 
     <errorPara>error4</errorPara> 
    </errorParameters> 
    </error> 
</Errors> 
+0

Bu seçeneği denedim ama kodumda diğer commplex mantığımız olduğu için benim durumumda çalışmadım. Problem ifadesini kukla XSD ile büyüttüm. – kumarb

0

Burada bakmak için bir (basit) yolu şudur:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="error"> 
    <xsl:copy> 
     <xsl:copy-of select="errorcode | errortype"/> 
     <errorParameters> 
      <xsl:for-each select="*[starts-with(name(), 'paramater')]"> 
       <errorPara> 
        <xsl:value-of select="."/> 
       </errorPara> 
      </xsl:for-each> 
     </errorParameters> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

hatasının başka çocuk errorcode, errortype ve parameterN dışında varsa şunu kullanabilirsiniz :

<xsl:for-each select="*[not(self::errorcode or self::errortype)]">