2014-10-20 62 views
0

我剛開始使用XSLT。我的輸入和預期輸出如下,XSLT也在下面給出。xslt 2.0更改節點名稱和包裝來自標記大小的節點

我有一個輸入的xml:

<servicio> 
    <control> 
     <codSer>00013</codSer> 
     <idMen>12378658936578</idMen> 
     <codErr>000</codErr> 
     <numId>000xxxxxxxx</numId> 
    </control> 
    <cuentas> 
     <tipPro>3</tipPro> 
     <numCta>000000006</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Cuenta I</desCta> 
     <saldo>001513003135</saldo> 
    </cuentas> 
    <cuentas> 
     <tipPro>1</tipPro> 
     <numCta>000000005</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Cuenta I</desCta> 
     <saldo>007573144537</saldo> 
     <signo>Pos</signo> 
    </cuentas> 
    <fondos> 
     <tipPro>4</tipPro> 
     <numCta>000000007</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Fondo I</desCta> 
     <saldo>001513003135</saldo> 
    </fondos> 
    <fondos> 
     <tipPro>4</tipPro> 
     <numCta>000000008</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Fondo I</desCta> 
     <saldo>007573144537</saldo> 
    </fondos> 
</servicio> 

,我需要應用一個XSL來獲得(輸出):

<servicio> 
<control> 
    <codSer>00013</codSer> 
    <idMen>12378658936578</idMen> 
    <codErr>000</codErr> 
    <numId>000xxxxxxxx</numId> 
</control> 
<cuentas> 
    <cuenta> 
     <tipPro>3</tipPro> 
     <numCta>000000006</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Cuenta I</desCta> 
     <saldo>001513003135</saldo> 
    </cuenta> 
    <cuenta> 
     <tipPro>1</tipPro> 
     <numCta>000000005</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Cuenta I</desCta> 
     <saldo>007573144537</saldo> 
     <signo>Pos</signo> 
    </cuenta> 
</cuentas> 
<fondos> 
    <fondo> 
     <tipPro>4</tipPro> 
     <numCta>000000007</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Fondo I</desCta> 
     <saldo>001513003135</saldo> 
    </fondo> 
    <fondo> 
     <tipPro>4</tipPro> 
     <numCta>000000008</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Fondo I</desCta> 
     <saldo>007573144537</saldo> 
    </fondo> 
</fondos> 
</servicio> 

我嘗試和沒有工作的XSL是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 
<xsl:output method="xml" /> 
<xsl:strip-space elements="*" /> 
<xsl:output indent="yes" /> 
<xsl:param name="elementInfo" select="cuentas,cuentas,cuenta;fondos,fondos,fondo"/> 

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

<xsl:template match="node()[name() = name(/*)]"> 
    <xsl:variable name="inputNode" select="." /> 
    <xsl:for-each select="tokenize($elementInfo, ';')"> 
     <xsl:variable name="tokenizedNodeNames" select="tokenize(.,',')" /> 
     <xsl:for-each select="$inputNode"> 
      <xsl:call-template name="wrapping"> 
       <xsl:with-param name="wrapperElementName" select="$tokenizedNodeNames[1]" /> 
       <xsl:with-param name="oldElementName" select="$tokenizedNodeNames[2]" /> 
       <xsl:with-param name="newElementName" select="$tokenizedNodeNames[3]" /> 
      </xsl:call-template> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template name="wrapping"> 
    <xsl:param name="wrapperElementName" /> 
    <xsl:param name="oldElementName" /> 
    <xsl:param name="newElementName" /> 
    <xsl:copy> 
     <xsl:apply-templates select="node()[not(name() = $oldElementName)]" /> 
     <xsl:element name="{$wrapperElementName}"> 
      <xsl:for-each select="node()[name() = $oldElementName]"> 
       <xsl:element name="{$newElementName}"> 
        <xsl:copy-of select="@*|node()" /> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:copy> 
</xsl:template> 

當我有一個輸入XM L whit僅適用於CUENTAS,但是當我嘗試使用FONDOS時,我使用的是格式化XML。

回答

0

我覺得你只是想喜歡cuentasfondos族元素通過node-name()

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="#all" 
    version="2.0"> 

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

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

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:for-each-group select="*" group-by="node-name(.)"> 
     <xsl:apply-templates select="." mode="wrap"/> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*" mode="wrap"> 
    <xsl:apply-templates select="current-group()"/> 
</xsl:template> 

<xsl:template match="cuentas | fondos" mode="wrap"> 
    <xsl:copy> 
    <xsl:apply-templates select="current-group()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="cuentas | fondos"> 
    <xsl:element name="{substring(local-name(), 1, string-length(local-name()) - 1)}"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

這樣一來,與撒克遜9.5,我得到的結果

<servicio> 
    <control> 
     <codSer>00013</codSer> 
     <idMen>12378658936578</idMen> 
     <codErr>000</codErr> 
     <numId>000xxxxxxxx</numId> 
    </control> 
    <cuentas> 
     <cuenta> 
     <tipPro>3</tipPro> 
     <numCta>000000006</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Cuenta I</desCta> 
     <saldo>001513003135</saldo> 
     </cuenta> 
     <cuenta> 
     <tipPro>1</tipPro> 
     <numCta>000000005</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Cuenta I</desCta> 
     <saldo>007573144537</saldo> 
     <signo>Pos</signo> 
     </cuenta> 
    </cuentas> 
    <fondos> 
     <fondo> 
     <tipPro>4</tipPro> 
     <numCta>000000007</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Fondo I</desCta> 
     <saldo>001513003135</saldo> 
     </fondo> 
     <fondo> 
     <tipPro>4</tipPro> 
     <numCta>000000008</numCta> 
     <tipCta>A</tipCta> 
     <desCta>Fondo I</desCta> 
     <saldo>007573144537</saldo> 
     </fondo> 
    </fondos> 
</servicio> 
+0

非常感謝你,我嘗試它並且工作正常,我只將「匹配」更改爲「* [name()= tokenize($ elementsToWrap,'\'')]」,因爲我可以接收作爲參數的將被分組的節點的名稱。 – user4160104 2014-10-24 15:40:39