2013-05-19 89 views
1

如果我看看xslt規範,它似乎是一個字符映射適用於整個文檔,位也可以在給定節點或模板內使用它?我可以將字符映射應用於給定節點嗎?

示例:我有一個包含查找值的節點,但它們可能包含在另一個模板中使用時無法正常運行的字符。現在我使用替換功能,但是在幾個字符變得難以閱讀或維護之後。所以,如果我有這樣的事情:

<xsl:variable name="myLookup" select=" 
replace(
replace(
replace(
replace(
string-join(/*/lookup/*, '|'), 
'\[','\\['), 
'\]','\\]'), 
'\(','\\('), 
'\)','\\)') 
"/> 

有沒有辦法實現像下面的虛擬示例?

<xsl:character-map name="escapechar"> 
    <xsl:output-character character="[" string="\[" /> 
    <xsl:output-character character="]" string="\]" /> 
    <xsl:output-character character="(" string="\(" /> 
    <xsl:output-character character=")" string="\)" /> 
</xsl:character-map> 

<xsl:variable name="myLookup" select="string-join(/*/lookup/*, '|')" use-character-map="escapechar"/> 

我知道這根本不起作用,它只是使我的請求有點可視化。

有什麼想法?

回答

0

我認爲XSLT 2.0中的字符映射是當結果樹序列化爲文件或流時應用的序列化功能,所以我不知道如何在轉換過程中將某個字符串應用於某個字符串或某個節點。

至於轉義正則表達式模式的元字符,也許http://www.xsltfunctions.com/xsl/functx_escape-for-regex.html幫助。

1

字符映射只是一個序列化的功能,這意味着它只能在轉換的最終輸出產生時執行。但是,您可以顯着簡化當前的代碼。

只需使用

replace($pStr, '(\[|\]|\(|\))','\\$1') 

下面是一個完整的例子

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <xsl:value-of select="my:escape(.)"/> 
</xsl:template> 

<xsl:function name="my:escape" as="xs:string"> 
    <xsl:param name="pStr" as="xs:string"/> 

    <xsl:value-of select="replace($pStr, '(\[|\]|\(|\))','\\$1')"/> 
</xsl:function> 
</xsl:stylesheet> 

當下面的XML文檔應用這種轉變:

<t>([a-z]*)</t> 

的希望,正確的結果產生:

\(\[a-z\]*\) 
相關問題