2010-05-28 150 views
3

在以下XSL轉換中,如何輸出'<'和'>'符號?XSLT特殊字符

輸入XML:

<TestResult bugnumber="3214" testname="display.methods::close->test_ManyInvoke" errortype="Failure"><ErrorMessage><![CDATA[calling close() method failed - expected:<2>]]></ErrorMessage> 

XSLT:

<xsl:template match="TestResult"> 
    <xsl:variable name="errorMessage"> 
    <xsl:value-of select="ErrorMessage" disable-output-escaping="yes"/> 
    </xsl:variable> 
    <Test name='{@testname}'> 
    <TestResult> 
    <Passed>false</Passed> 
    <State>failure</State> 
    <Metadata> 
    <Entry name='bugnumber' value='{@bugnumber}' /> 
    </Metadata> 
    <TestOutput> 
    <Metadata> 
     <Entry name='ErrorMessage' value='{$errorMessage}' /> 
    </Metadata> 
    </TestOutput> 
    </TestResult> 
    </Test> 
</xsl:template> 

輸出XML:

<Test name="display.methods::close-&gttest_ManyInvoke"> 
<TestResult> 
    <Passed>false</Passed> 
    <State>failure</State> 
    <Metadata> 
    <Entry name="bugnumber" value="3214"/> 
    </Metadata> 
    <TestOutput> 
    <Metadata> 
    <Entry name="ErrorMessage" value="calling close() method failed - expected:&lt;2&gt;"/> 
    </Metadata> 
    </TestOutput> 
</TestResult> 
</Test> 
+0

好問題(+1)。查看我的答案獲得完整的解決方案。 – 2010-05-28 01:29:24

回答

7

簡短的回答:你Ç螞蟻。

龍回答:屬性的值不能包含一些特殊的字符,如'<''>''&'

如果存在,則它們被轉義爲:'&lt;','&gt;''&amp;'

如果輸出方法是'text',那麼這些字符就可以生成,這不是你的情況。

在瀏覽器中顯示時看起來像這些字符的文本也可以生成:使用:'&lt;','&gt;''&amp;'

最後,您可以使用CDATA部分將這些字符生成爲文本節點的一部分。下面的例子說明了這一點:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output cdata-section-elements="t" 
    omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <t> &lt; &amp; &gt;</t> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在任何XML文檔(未使用)應用,其結果是:

<t><![CDATA[ < & >]]></t> 
1

如果&gt;被顯示在你的屬性了事實問題在於,XML是如何被消費的,而不是如何生產的。

任何XML解析器在用於檢索屬性值時都不會使用轉義字符實體。如果您在使用XML文檔時使用XML解析器,您將永遠無法看到這一點;解析器會告訴你該屬性的值是display.methods::close->test_ManyInvoke

這很可能對我來說,這個「問題」只是針對出現的原因有兩個:

  1. 人誰不明白XML是如何工作的期待在輸出,並說,「嘿,它不應該這樣做。「

  2. 有人不明白XML是如何工作的,他寫了自己的邏輯來解析XML。 (「當我只寫一個簡單的正則表達式時,爲什麼我應該使用別人的XML解析器?」嗯,這就是爲什麼。)

根據經驗,一般情況下,如果你發現自己在XSLT使用disable-output-escaping='yes',或創建CDATA部分,你可能做了錯誤的事情。這不是某些 - 兩者都有適當的用途 - 但以我的經驗來看,絕大多數時候如果答案是「使用CDATA」,那麼你提出的是錯誤的問題。

0

如果您試圖在字符串文字中除「&」之外的任何內容,請小心。例如,

test="$some_variable = 'Wendy&apos;s'" 

不起作用。你要逃跑,在逃跑的字符串,第一個符號,所以你需要使用

test="$some_variable = 'Wendy&amp;apos;s' 
0

這是一個非常古老的問題,以及其他評論者質疑爲什麼你需要這可能是正確的,但如果你只是想知道如何添加<或>到你的輸出中,這是你如何做到的。

<xsl:value-of disable-output-escaping="yes" select="string('&lt;')"/> 

更多信息在MSDN site