我需要替换输入xml的多个元素的值。输入文件有大约300个元素,我需要替换大约100个元素。我之前使用过身份模板,但我认为这需要我写100个不同的模板来替换单个元素值。我不是很擅长xslts,所以,我认为它是正确的,还是有更好的优雅方法?请指教。
修改
输出结构几乎相同,但某些元素的值不同。
答案 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的不同层次结构中的名称相同,则需要更多工作。