在应用任何其他模板之前,如何将完整文档翻译为小写?

时间:2012-02-17 10:01:31

标签: xml xslt xslt-1.0

我有一个XSL转换,我用它来查询字符串:

<xsl:value-of select="/input/as/a[@id=$id]/CaMeL[@id2=$id2]/@interest"/>

现在,CaMeL(在XML中)应该重命名为cAmEl。精细。简单地在我的变换中修改案例会立即起作用,但我会失去向后的兼容性。

在搜索SO时,我发现了这个:XSLT Stylesheet: Changing text to upper case

accepted answer看起来很有希望,但我目前仍然坚持如何填写答案中使用的doc参数。

如何在现有的<xsl:template match="/">中添加翻译步骤,在将要应用任何其他模板之前将整个文档翻译为小写?

1 个答案:

答案 0 :(得分:3)

也许这会有所帮助。但我没有测试它。你能提供一些XML样本吗?

<xsl:value-of select="/input/as/a[@id=$id]/*[translate(local-name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='camel' and @id2=$id2]/@interest"/>

修改

如果要将整个XML文件更改为小写(当然没有元素和属性值),可以使用以下模板:

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

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

  <xsl:template match="*">
    <xsl:element name="{translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                         'abcdefghijklmnopqrstuvwxyz')}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

完成转换为小写后,您可以尝试创建多次传递XSLT - 下一次传递将是您的转换。但是,我不知道如何使用XSLT 1.0。

编辑2

好的,所以这就是整个例子。我没有你的例子所以我自己做了。

示例输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<baba>aaa</baba>
<Baba>BBB</Baba>
</Root>

使用多次传递排序的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="firstPassResult">
        <xsl:apply-templates select="/" mode="firstPass"/>
    </xsl:variable>
    <xsl:template match="@*|node()" mode="firstPass">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*" mode="firstPass">
        <xsl:element name="{translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                         'abcdefghijklmnopqrstuvwxyz')}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="/">
        <xsl:apply-templates select="$firstPassResult" mode="secondPass"/>
    </xsl:template>
    <xsl:template match="//baba" mode="secondPass">
        <xsl:value-of select="text()"/>
    </xsl:template>
</xsl:stylesheet>

我在Altova XMLSpy调试器下工作。输出:

<?xml version="1.0" encoding="UTF-8"?>aaaBBB