我使用的是XSLT1.0,使用的是jre1.6中的内置处理器
当我使用SAXONHE jar将处理器更改为XSLT2.0时,大多数模板匹配突然不起作用。
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@source[. = 'SG']">
<xsl:attribute name="source">MIG</xsl:attribute>
</xsl:template>
<xsl:template match="customer/@homeAddress"/>
<xsl:param name="removeInvAttr" select="'indexDefinition|services|paymentMethod'"/>
<xsl:template match="invoice/@*">
<xsl:for-each select="@*">
<xsl:if test="not(name() = $removeInvAttr)">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:variable name="vLowercaseChars_CONST" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vUppercaseChars_CONST" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:template match="@country">
<xsl:attribute name="country"><xsl:value-of select="translate(. , $vLowercaseChars_CONST , $vUppercaseChars_CONST)"/></xsl:attribute>
</xsl:template>
<xsl:template match="@claimingSystem">
<xsl:if test="string-length(.) > 5">
<xsl:attribute name="claimingSystem"><xsl:value-of select="substring(.,1,5)"/></xsl:attribute>
</xsl:if>
</xsl:template>
除第一个模板"标识"外,上述所有模板均无效
如何使它们同时在XSLT2.0和1.0中工作?
输入xml为:
<dynamicData source="SG">
<customer name="Cyrus S" homeAddress="NY" custType="P" country="us">
<invoice amount="250" invType="C" indexDefinition="SECR" services="TYRE_REP" paymentMethod="CC" claimingSystem="EX001-S1"/>
</customer>
</dynamicData>
预期输出为:
<dynamicData source="MIG">
<customer name="Cyrus S" custType="P" country="US">
<invoice amount="250" invType="C" claimingSystem="EX001"/>
</customer>
</dynamicData>
这适用于XSLT1.0。
我不知道
<xsl:param name="removeInvAttr" select="'indexDefinition|services|paymentMethod'"/>
<xsl:template match="invoice/@*">
<xsl:for-each select="@*">
<xsl:if test="not(name() = $removeInvAttr)">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
可以做任何事情,因为参数是一个由条形|
分隔的字符串,同样重要的是,对于match="invoice/@*"
,xsl:for-each select="@*"
不会选择任何内容(作为属性节点,因为上下文节点本身没有任何属性节点)。
所以我怀疑你想要
<xsl:param name="removeInvAttr" select="'indexDefinition|services|paymentMethod'"/>
<xsl:variable name="removeAttrNames" select="tokenize($removeInvAttr)"/>
和
<xsl:template match="invoice/@*[name() = $removeAttrNames]"/>