2012-02-17 35 views
2

我有一個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="/">中添加翻譯步驟,在將要應用任何其他模板之前將整個文檔翻譯爲小寫字母?

回答

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來執行此操作。

EDIT 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 
+0

多通?聽起來不錯。告訴我更多:-)我該怎麼做? – eckes 2012-02-17 11:35:20

+0

@eckes:看我編輯 – Lukasz 2012-02-17 11:47:35

+0

完美!我從現在開始使用XSL,但從未使用**模式**。謝謝! – eckes 2012-02-17 12:03:11

相關問題