2

由于下面的源 XML 值/字符串元素值必须替换为目标元素值,请有人帮助我如何创建 XSL 以将源 xml 转换为目标 xml。请。

源 XML:

 <PricingResultsV6>     
 <subItems>
 <SubItem>   
 <profiles>
 <ProfileValues>
 <values> 
 <strings>800210</strings> 
 <strings>THC</strings> 
 <strings>10.0</strings> 
 <strings>20.0</strings> 
 <strings>30.0</strings> 
 <strings>40.0</strings> 
 <strings>550.0</strings> 
 <strings>640.0</strings> 
 </values>
</ProfileValues>
</rofiles>
</SubItem>
</subItems>
</PricingResultsV6>

目标 XML:

<CalculationOutput>
            <PolicyNumber> 800210 </PolicyNumber>
            <CommissionFactorMultiplier> THC </CommissionFactorMultiplier>
            <PremiumValue>10.0</PremiumValue>
            <SalesmanCommissionValue>20.0</SalesmanCommissionValue>
            <ManagerCommissionValue>30.0</ManagerCommissionValue>
            <GL_COR> 550.0</GL_COR>
            <GL_OPO>640.0</GL_OPO>

</CalculationOutput>
4

3 回答 3

2

利用:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" />

    <xsl:template match="//values">
        <CalculationOutput>
            <PolicyNumber>
                <xsl:value-of select="strings[1]"/>
            </PolicyNumber>
            <CommissionFactorMultiplier>
                <xsl:value-of select="strings[2]"/>
            </CommissionFactorMultiplier>
            <PremiumValue>
                <xsl:value-of select="strings[3]"/>
            </PremiumValue>
            <SalesmanCommissionValue>
                <xsl:value-of select="strings[4]"/>
            </SalesmanCommissionValue>
            <ManagerCommissionValue>
                <xsl:value-of select="strings[5]"/>
            </ManagerCommissionValue>
            <GL_COR>
                <xsl:value-of select="strings[7]"/>
            </GL_COR>
            <GL_OPO>
                <xsl:value-of select="strings[8]"/>
            </GL_OPO>
        </CalculationOutput>
    </xsl:template>
</xsl:stylesheet>

输入:

<PricingResultsV6>     
    <subItems>
        <SubItem>   
            <profiles>
                <ProfileValues>
                    <values> 
                        <strings>800210</strings> 
                        <strings>THC</strings> 
                        <strings>10.0</strings> 
                        <strings>20.0</strings> 
                        <strings>30.0</strings> 
                        <strings>40.0</strings> 
                        <strings>550.0</strings> 
                        <strings>640.0</strings> 
                    </values>
                </ProfileValues>
            </profiles>
        </SubItem>
    </subItems>
</PricingResultsV6>

输出:

<CalculationOutput>
    <PolicyNumber>
        800210
    </PolicyNumber>
    <CommissionFactorMultiplier>
        THC
    </CommissionFactorMultiplier>
    <PremiumValue>
        10.0
    </PremiumValue>
    <SalesmanCommissionValue>
        20.0
    </SalesmanCommissionValue>
    <ManagerCommissionValue>
        30.0
    </ManagerCommissionValue>
    <GL_COR>
        550.0
    </GL_COR>
    <GL_OPO>
        640.0
    </GL_OPO>
</CalculationOutput>
于 2012-08-29T23:32:15.483 回答
1

啊。我刚刚回答了这个问题的确切副本

由于我的 XSLT 1.0 示例和我的 XSLT 2.0 示例都包含在 Dimitre 和 Kirill 的答案中,我将添加我的 XSLT 3.0 答案...

XML 输入

<PricingResultsV6>
    <subItems>
        <SubItem>
            <profiles>
                <ProfileValues>
                    <values>
                        <strings>800210</strings>
                        <strings>THC</strings>
                        <strings>10.0</strings>
                        <strings>20.0</strings>
                        <strings>30.0</strings>
                        <strings>40.0</strings>
                        <strings>550.0</strings>
                        <strings>640.0</strings>
                    </values>
                </ProfileValues>
            </profiles>
        </SubItem>
    </subItems>
</PricingResultsV6>

XSLT 3.0(使用 Saxon-EE 9.4 测试)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    exclude-result-prefixes="map">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="vMap" select="map {
        1:='PolicyNumber',
        2:='CommissionFactorMultiplier',
        3:='PremiumValue',
        4:='SalesmanCommissionValue',
        5:='ManagerCommissionValue',
        7:='GL_COR',
        8:='GL_OPO',
        }"/>

    <xsl:template match="ProfileValues">
        <CalculationOutput>
            <xsl:apply-templates select="values/strings"/>
        </CalculationOutput>
    </xsl:template>

    <xsl:template match="strings[map:contains($vMap,position())]">      
        <xsl:element name="{map:get($vMap,position())}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="text()"/>

</xsl:stylesheet>

XML 输出

<CalculationOutput>
   <PolicyNumber>800210</PolicyNumber>
   <CommissionFactorMultiplier>THC</CommissionFactorMultiplier>
   <PremiumValue>10.0</PremiumValue>
   <SalesmanCommissionValue>20.0</SalesmanCommissionValue>
   <ManagerCommissionValue>30.0</ManagerCommissionValue>
   <GL_COR>550.0</GL_COR>
   <GL_OPO>640.0</GL_OPO>
</CalculationOutput>
于 2012-08-30T04:19:24.327 回答
0

strings这种通用转换允许在元素和必须生成的相应元素名称之间进行单独的(即使在不同的文档中或作为外部参数传递)映射:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:mapping>
  <map key="1" value="PolicyNumber"/>
  <map key="2" value="CommissionFactorMultiplier"/>
  <map key="3" value="PremiumValue"/>
  <map key="4" value="SalesmanCommissionValue"/>
  <map key="5" value="ManagerCommissionValue"/>
  <map key="7" value="GL_COR"/>
  <map key="8" value="GL_OPO"/>
 </my:mapping>
 <xsl:variable name="vMaps" select="document('')/*/my:mapping/*"/>  

 <xsl:template match="values">
     <CalculationOutput>
       <xsl:apply-templates/>
     </CalculationOutput>
 </xsl:template>

 <xsl:template match="strings">
  <xsl:if test="position()=$vMaps/@key">
    <xsl:variable name="vPos" select="position()"/>
    <xsl:element name="{$vMaps[@key = $vPos]/@value}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<PricingResultsV6>
    <subItems>
        <SubItem>
            <profiles>
                <ProfileValues>
                    <values>
                        <strings>800210</strings>
                        <strings>THC</strings>
                        <strings>10.0</strings>
                        <strings>20.0</strings>
                        <strings>30.0</strings>
                        <strings>40.0</strings>
                        <strings>550.0</strings>
                        <strings>640.0</strings>
                    </values>
                </ProfileValues>
            </profiles>
        </SubItem>
    </subItems>
</PricingResultsV6>

产生了想要的正确结果

<CalculationOutput>
   <PolicyNumber>800210</PolicyNumber>
   <CommissionFactorMultiplier>THC</CommissionFactorMultiplier>
   <PremiumValue>10.0</PremiumValue>
   <SalesmanCommissionValue>20.0</SalesmanCommissionValue>
   <ManagerCommissionValue>30.0</ManagerCommissionValue>
   <GL_COR>550.0</GL_COR>
   <GL_OPO>640.0</GL_OPO>
</CalculationOutput>

二、这个解决方案可以通过使用 keys 变得非常高效

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:mapping>
  <map key="1" value="PolicyNumber"/>
  <map key="2" value="CommissionFactorMultiplier"/>
  <map key="3" value="PremiumValue"/>
  <map key="4" value="SalesmanCommissionValue"/>
  <map key="5" value="ManagerCommissionValue"/>
  <map key="7" value="GL_COR"/>
  <map key="8" value="GL_OPO"/>
 </my:mapping>
 <xsl:variable name="vMaps" select="document('')/*/my:mapping/*"/>  

 <xsl:key name="kValueByKey" match="@value" use="../@key"/>

 <xsl:template match="values">
     <CalculationOutput>
       <xsl:apply-templates/>
     </CalculationOutput>
 </xsl:template>

 <xsl:template match="strings">
  <xsl:if test="position()=$vMaps/@key">
    <xsl:variable name="vPos" select="position()"/>
    <xsl:variable name="vCur" select="."/>
     <xsl:for-each select="$vMaps/..">
        <xsl:element name="{key('kValueByKey', $vPos)}">
          <xsl:value-of select="$vCur"/>
        </xsl:element>
     </xsl:for-each>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>
于 2012-08-30T01:52:07.810 回答