2015-12-30 55 views
0

我试图将属性值转换为大写,并使用下面的一段xslt对其进行转换。但是,这些词没有完全转化。在xslt中将XML节点转换为大写

<xsl:param 
    name="lang_lower" 
    select="'abcdefghijklmnopqrstuvwxyz'" /> 
<xsl:param 
    name="lang_upper" 
    select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 

<xsl:template match="//*[@attributename]"> 
    <xsl:element name="{name()}"> 
     <xsl:attribute name="L"> 
    <xsl:value-of select="translate(@attributename, $lang_lower, $lang_upper)" /> 
    </xsl:attribute> 
     <xsl:copy-of select="@*[name()!='attributename']" /> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

但是,有时属性('attributename')中的值没有得到转换。

+2

请发布一个最小但完整的XML示例和一个最小但完整的XSLT示例,以便我们重现该问题,以及有关使用的XSLT处理器,获取的结果以及所需结果的信息。 –

+0

当我使用这个模板进行转换时,其中一些单词会被转换,剩下的则会被忽略。例如,在'de'中,输出被转换为'dE'而不是'DE'等。 –

+0

同时,用于改变情况的转换发生在模板的末尾。但是,对于'attributename'的父项还有另一个xslt模板。在这种情况下,转换是否存在问题? –

回答

0

您还没有提供任何信息让我们重现该问题,我所看到的唯一奇特之处在于,您不想匹配想要转换的属性,而是匹配其父元素。所以,我会改变代码

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

<xsl:param 
    name="lang_lower" 
    select="'abcdefghijklmnopqrstuvwxyz'" /> 
<xsl:param 
    name="lang_upper" 
    select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@attributename"> 
    <xsl:attribute name="L"> 
     <xsl:value-of select="translate(., $lang_lower, $lang_upper)" /> 
    </xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 

然后应该做的罚款,看到http://xsltransform.net/bnnZWo当输入

<root> 
    <foo attributename="de" bar="baz"/> 
</root> 

转化为结果

<?xml version="1.0" encoding="utf-8"?><root> 
    <foo L="DE" bar="baz"/> 
</root> 

如果仍然有问题,那么提供最少但完整的样本,让其他人重现问题。