xsl-list
[Top] [All Lists]

[xsl] Transform selected attribute to element when element already has a value | XSLT 2.0

2021-05-21 09:30:15
Input:
 <requestConfirmation xmlns="http://example/confirmation";>    <trade>
        <cal>
            <c>PRECEDING</c>
            <bcs id="businessCenters">
                <bc>USNY</bc>
                <bc>GBLO</bc>
            </bcs>
        </cal>  
        <amount>
            <currency id="settlementCurrency" 
currencyScheme="http://example/iso4";>USD</currency>
            <referenceAmount>StandardISDA</referenceAmount>
            <cashSettlement>true</cashSettlement>
        </amount>
    </trade>
</requestConfirmation>
My module: <xsl:param name="namespace" 
as="xs:string">http://fc.fasset/product</xsl:param>
    <xsl:param name="root" as="xs:string">requestProduct</xsl:param>
    <xsl:param name="keepAttr" static="yes" as="xs:string*" select="'href', 
'id'"/>
    
    <xsl:template match="/*">
        <xsl:element name="{$root}" namespace="{$namespace}">
            <xsl:apply-templates select="@* , node()"/>
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="{$namespace}">
            <xsl:apply-templates select="@* , node()"/>
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="@*">
        <xsl:choose>
            <xsl:when test="local-name() = $keepAttr">
                <xsl:element name="{local-name()}" namespace="{$namespace}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
Undesirable result:
<requestProduct xmlns="http://fc.fasset/product";>
   <trade>
      <cal>
         <c>PRECEDING</c>
         <bcs>
            <id>businessCenters</id>
            <bc>USNY</bc>
            <bc>GBLO</bc>
         </bcs>
      </cal>
      <amount>
         <currency>
            <id>settlementCurrency</id>USD</currency>
         <referenceAmount>StandardISDA</referenceAmount>
         <cashSettlement>true</cashSettlement>
      </amount>
   </trade>
</requestProduct>The transformation logic:
1) transform namespace 
2) transform root element 
3) transform the selected attribute(s) to element (the attribute name is 
parameterised not hard-coded) 
4) the transformed element shouldn't contain both other element (transformed 
from the attribute) and its original data
The desired result:
<requestProduct xmlns="http://fc.fasset/product";>
   <trade>
      <cal>
         <c>PRECEDING</c>
         <bcs>
            <id>businessCenters</id>
            <bc>USNY</bc>
            <bc>GBLO</bc>
         </bcs>
      </cal>
      <amount>
         <currency>USD</currency>
         <id>settlementCurrency</id>
         <referenceAmount>StandardISDA</referenceAmount>
         <cashSettlement>true</cashSettlement>
      </amount>
   </trade>
</requestProduct>What is wrong with my module? How can I transform the input to 
the desired result? 
Thank you!

    
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>