我有一个用例,我只需要修改XML文件中的一个属性,并且需要保留其他部分。在我的示例XML和构建的XSLT下面,我实际上是在尝试更改"customerdetails"。作为"userDetails"使用XSLT,但我需要明确提及XSLT中的所有其他XML属性。
是否有一种方法可以优化这一点,就像只写逻辑customerDetails到XSLT中的userDetails,而不触及其他属性?
示例XML
<?xml version="1.0" encoding="UTF-8"?>
<RespData>
<customerName>XXXX</customerName>
<customerDetails>
<customerId>123</customerId>
<customerAddress>YYYY</customerAddress>
</customerDetails>
</RespData>
示例XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<RespData>
<customerName>
<xsl:value-of select="/RespData/customerName" />
</customerName>
<xsl:for-each select="/RespData/customerDetails">
<userDetails>
<customerId>
<xsl:value-of select="customerId" />
</customerId>
<customerAddress>
<xsl:value-of select="customerAddress" />
</customerAddress>
</userDetails>
</xsl:for-each>
</RespData>
</xsl:template>
</xsl:stylesheet>
你根本没有任何属性,只有子元素;至于正确的方法,从单位变换开始,您可以在XSLT 3中使用顶级<xsl:mode on-no-match="shallow-copy"/>
声明它,或者在XSLT 1/2中使用
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后为你需要的每一个微小的改变添加模板,例如
<xsl:template match="customerDetails">
<userDetails>
<xsl:apply-templates/>
</userDetails>
</xsl:template>