xslt替换多个元素的值

时间:2013-09-16 05:30:59

标签: xslt-1.0

我需要替换输入xml的多个元素的值。输入文件有大约300个元素,我需要替换大约100个元素。我之前使用过身份模板,但我认为这需要我写100个不同的模板来替换单个元素值。我不是很擅长xslts,所以,我认为它是正确的,还是有更好的优雅方法?请指教。

修改

这是Link of sample input xml

输出结构几乎相同,但某些元素的值不同。

1 个答案:

答案 0 :(得分:0)

嗯,之前我做过类似的事情,所以我很乐意分享...修改到你的例子但是不做值映射,它确实命名映射。 首先创建一个这样的简单映射文件(注意:您需要命名空间才能正确执行此操作

    <env:map xmlns:env="http://www.w3.org/2003/05/soap-envelope">
        <elem old="CardCode" new="CodeCardNEW"/>
        <elem old="CardName" new="IAMNew"/>
    </env:map>

然后一个模板会对您进行查找。有可能更好的方法来进行映射,我只是为了 - 每个循环遍及它们......一把钥匙会更好。但这会让你到那儿。

上述文件的输出:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Body>
<GetByKeyResponse>
  <BOM>
    <BO>
      <AdmInfo>
        <Object>oBusinessPartners</Object>
      </AdmInfo>
      <BusinessPartners>
        <row>
          <CodeCardNEW>CR43WEB</CodeCardNEW>
          <IAMNew>Zack Burns</IAMNew>
          <CardType>cCustomer</CardType>
            ...

这是XSL:

   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:env="http://www.w3.org/2003/05/soap-envelope"
        version="1.0">
        <xsl:param name="map" select="document('map.xml')/env:map"></xsl:param>

        <xsl:template match="text()" priority="1">
            <xsl:value-of select="."/>
        </xsl:template>

        <xsl:template match="@*|node()">
            <xsl:variable name="newname">
            <xsl:call-template name="namesub">
                <xsl:with-param name="name" select="name()"/>
            </xsl:call-template>
            </xsl:variable>
            <xsl:element name="{$newname}">
                <xsl:apply-templates select="@*|node()"/>
            </xsl:element>
        </xsl:template>

        <xsl:template name="namesub">
            <xsl:param name="name"/>
            <xsl:variable name="newname">
            <xsl:for-each select="$map/elem">
                <xsl:choose>
                    <xsl:when test="@old = $name">
                        <xsl:value-of select="@new"/>
                    </xsl:when>
                </xsl:choose>
            </xsl:for-each>
            </xsl:variable>
            <xsl:choose>
                <xsl:when test="string-length($newname) > 0">
                    <xsl:value-of select="$newname"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$name"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>

    </xsl:stylesheet>

只要名称匹配,您就应该能够对其进行调整...如果XML的不同层次结构中的名称相同,则需要更多工作。