2017-08-19 127 views
0

在我的映射项目中,我有一个基于xml结构的源代码。请注意大写的节点名称和属性值:XSL转换解决方案

<ROOT> 
    <INPUT>  
     <NODEA 
      ATT1="xxx" 
      ATT2="xxx" /> 
     <NODEB 
      ATT1="xxx" 
      ATT2="xxx" /> 
    </INPUT> 
</ROOT> 

和其他基于此xml的xsd用于目标。注意:小写名称和元素值:

<operation> 
    <input> 
     <nodea> 
      <att1>xxx</att1> 
      <att2>xxx</att2> 
     </nodea> 
     <nodeb> 
      <att1>xxx</att1> 
      <att2>xxx</att2> 
     </nodeb> 
    </input> 
</operation> 

我怎样才能得到一个XSL转换,通过树节点,类似这样的分组,与Altova的MapForce的2017年?注意节点意见和变量名:

<xsl:template match="/ROOT"> 
    <operation>   
     <input>      
      <xsl:for-each select="INPUT">   
       <!-- NODEA --> 
       <xsl:for-each select="NODEA">     
        <!-- ATT1 --> 
        <xsl:for-each select="@ATT1"> 
         <xsl:variable name="v_ATT1" select="."/> 
         <att1> 
          <xsl:value-of select="string($v_ATT1)"/> 
         </att1> 
        </xsl:for-each>     
        <!-- ATT2 --> 
        <xsl:for-each select="@ATT2"> 
         <xsl:variable name="v_ATT2" select="."/> 
         <att2> 
          <xsl:value-of select="string($v_ATT2)"/> 
         </att2> 
        </xsl:for-each>     
       </xsl:for-each>    
       <!-- NODEB --> 
       <xsl:for-each select="NODEB"> 
        <!-- ATT1 --> 
        ... 
        <!-- ATT2 --> 
        ... 
       </xsl:for-each>    
      </xsl:for-each> 
     </input> 
    </operation>   
</xsl:template> 

的Altova的MapForce的创建此不同的解决方案:

<xsl:stylesheet ... > 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:variable name="var1_initial" select="."/> 
     <operation xmlns="..."> 
      <xsl:attribute ...> 
      <input> 
       <xsl:for-each select="*[local-name()='ROOT' and namespace-uri()='']"> 
        <xsl:variable name="var2_cur" select="."/> 
        <att1> 
         <xsl:value-of select="*[local-name()='INPUT' and namespace-uri()='']/*[local-name()='NODEA' and namespace-uri()='']/@ATT1"/> 
        </att1> 
        ... 
       </xsl:for-each> 
      </input> 
     </operation> 
    </xsl:template> 
</xsl:stylesheet> 
+0

什么是'有用吗?某个元素只能拥有某个特定名称的单个属性(例如'ATT1'),所以我根本不明白'for-each'的内在用处是什么。你的文字说“按树节点分组”,这是什么意思?如果一个'INPUT'可以有几个例如'NODEA'孩子,你想用XSLT 2.0对他们进行分组,你应该简单地处理''。 –

+0

问题不明确。这两个可能的输入是否是同一个转换?或者是一个输入,另一个是预期的输出? –

+0

我认为你是对的,没有必要为属性嵌套for-each。 – Sergio

回答

0

如果你的目的是将第一XML转换成第二个,那么为什么不T优做简单:

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="*"/> 

<xsl:param name="upper-case" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:param name="lower-case" select="'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:template match="/ROOT"> 
    <operation> 
     <xsl:apply-templates/> 
    </operation> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="{translate(name(), $upper-case, $lower-case)}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:element name="{translate(name(), $upper-case, $lower-case)}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

这里没有涉及的分组 - 只是重命名节点并将属性转换为元素。

+0

有时NODEA有其他Camelcase名称,例如FirstName,LastName ...我写了一个名称的一般情况。 – Sergio

+0

@Sergio你试过了吗? –