2016-11-29 56 views
0

我想這些元件分開他們的價值觀:裂元件和dynamicaly使用xslt1 1.0

<?xml version="1.0" encoding="UTF-8"?> 
<CTP> 
    <name>ABSA bank</name> 
    <BAs> 
     <BA>bank</BA> 
     <BA>sector</BA> 
     <BA>issuer</BA> 
    </BAs> 
    <altIDs> 
     <altID> 
      <label.altSystem>ABSB|BBG</label.altSystem> 
      <label.altSystem>ASB|Reuters</label.altSystem> 
     </altID> 
    </altIDs> 
</CTP> 

爲這種格式:

<?xml version="1.0" encoding="UTF-8"?> 
    <CTP> 
    <name>ABSA bank</name> 
    <BAs> 
     <BA>bank</BA> 
     <BA>sector</BA> 
     <BA>issuer</BA> 
    </BAs> 
    <altIDs> 
     <aldID> 
      <label>ABSB</label> 
      <altSystem>BBG</altSystem> 
     </aldID> 
     <aldID> 
      <label>ASB</label> 
      <altSystem>Reuters</altSystem> 
     </aldID> 
    </altIDs> 
</CTP> 

IM使用XSLT新IM試圖解決這個問題,我們如何在XSLT 1.0中做到這一點?

突出變質部:

原始

<altID> 
    <label.altSystem>ABSB|BBG</label.altSystem> 
    <label.altSystem>ASB|Reuters</label.altSystem> 
</altID> 

轉化

<aldID> 
    <label>ABSB</label> 
    <altSystem>BBG</altSystem> 
</aldID> 
<aldID> 
    <label>ASB</label> 
    <altSystem>Reuters</altSystem> 
</aldID> 
+0

這是怎麼d ifferent from:http://stackoverflow.com/questions/40678961/split-xml-element-into-many –

+0

它的不同之處在於,該算法用於創建新元素,而不是分割元素及其值,並給出每個元素的部分元素是他們價值的一部分。 @ michael.hor257k –

回答

0
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <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="*[contains(name(), '_')]" name="nest"> 
     <xsl:param name="name" select="name()" /> 
     <xsl:param name="delimiter" select="'_'" /> 
     <xsl:param name="text" select="." /> 
     <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
     <xsl:choose> 
      <xsl:when test="contains($name, $delimiter)"> 
       <xsl:element name="{substring-before($name, $delimiter)}"> 
        <xsl:value-of select="$token" /> 

       </xsl:element> 
       <xsl:element name="{substring-after($name, $delimiter)}"> 
        <xsl:variable name="token" select="substring-after($text, $delimiter)" /> 
        <xsl:value-of select="$token" /> 

        <!-- recursive call --> 
        <xsl:call-template name="nest"> 
         <xsl:with-param name="name" select="substring-after($name, $delimiter)" /> 
         <xsl:with-param name="text" select="substring-after($text, $delimiter)" /> 
        </xsl:call-template> 
       </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet>