2011-02-23 72 views
2


我將文本轉換(其中還包含其他文本不僅是一個超鏈接),以超鏈接使用下列內容:
逃逸內XSLT的HTML標籤:值的XML文檔元素中選擇

<xsl:value-of 
    select="replace(AUTHOR_CONTACT_INFORMATION, 
        '([email protected])', 
        '&lt;a href=&quot;$1&quot;&gt;$1&lt;/a&gt;')"/> 

XML來源:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at [email protected] for his email.</AUTHOR_CONTACT_INFORMATION> 

不幸的是,我無法逃脫的HREF使用的 '<' & '>' 標籤。我的XSLT處理器是Qt4的QXmlQuery類。看起來它不支持上述表達式中的「disable-output-escaping」屬性,我似乎無法找到任何其他方式,而不是手動分析最終輸出並將每個'& lt'&'& gt'與'<'&'>'使用C++代碼。

PS:無法得到'analyze-string'在qt中工作。它只是返回空字符串。 Refered到http://www.dpawson.co.uk/xsl/rev2/regex2.html問題3和使用下列內容:

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="([email protected])"> 
    <xsl:matching-substring> 
     <a href="{.}"><xsl:value-of select="." /></a> 
    </xsl:matching-substring> 

    <xsl:non-matching-substring> 
     <xsl:value-of select="." /> 
    </xsl:non-matching-substring> 
</xsl:analyze-string> 

以上工作正常「的Altova XMLSpy的」究竟在做我想要的。但是在Qt4中,輸出有空字符串(爲了更準確,我的<td>標籤在這個表達式也神祕地消失在輸出之前,很奇怪)。 Qt4文檔說它的處理器支持'xsl:analyze-string'。任何人在Qt中都有一個'xsl:analyze-string'的工作示例?

Qt4文檔說它的處理器不支持'xsl:character-map',所以沒有意義去那裏。

沒有'xsl:analyze-string'的工作我回到原來的'replace()'。 '(這裏的正則表達式)'

<xsl:value-of select="replace(AUTHOR_CONTACT_INFORMATION, 

,'<一個 :

-Sanjeev

+0

我不好2.0,但也可以是[XSL:字符映射(http://www.w3.org/TR/xslt20/#dt-character-map )可能會有所幫助。 – Flack 2011-02-23 07:39:10

+0

您不能通過像這樣生成'<'來創建標籤。你需要輸出一個實際的標籤(即'(regex match)'。 – Flynn1179 2011-02-23 09:54:40

+0

)你的輸入是什麼,你想要創建什麼輸出?可能是'xsl:analyze-string' http://www.w3.org/TR/xslt20 /#analyze-string可以提供幫助,如果你的目標是用正則表達式解析純文本,在輸出中建立一個鏈接元素。 – 2011-02-23 11:15:04

回答

2

大家好,我將文字 XML文檔元素中使用的超鏈接 以下href = " $ 1 " > $ 1 </a >')「

不幸的是,我無法逃脫的HREF

簡短的回答使用的「<」 &「>」標籤:你不應該去嘗試這樣做。

轉義標記將其降級爲一維文本,並且只會在瀏覽器中顯示爲文本。

的正確的方法來做到這是生成標記爲(序列)文字結果元素:

<xsl:template match="AUTHOR_CONTACT_INFORMATION"> 
    <a href="{someExpression}"><xsl:value-of select="someExpr2"/></a> 
</xsl:template> 

UPDATE:該OP提供關於真實問題的詳細信息。問題是,以下是他的XSLT處理器「不工作」 - Qt4?

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="([email protected])"> 
    <xsl:matching-substring> 
     <a href="{.}"> 
      <xsl:value-of select="." /> 
     </a> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:value-of select="." /> 
    </xsl:non-matching-substring> 
</xsl:analyze-string> 

我已經驗證該代碼的行爲與預期併產生預期的結果時,撒克遜05年9月1日下運行。

這意味着Qt4不是一個兼容的XSLT 2.0處理器。

在這裏,我可以提供以下的替代解決方案,其與XSLT 1.0處理器和XSLT 2.0處理器是雙向:

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

<xsl:template match="AUTHOR_CONTACT_INFORMATION"> 
    <xsl:value-of select= 
    "substring-before(., '[email protected]')"/> 
    <a href="[email protected]">[email protected]</a> 
    <xsl:value-of select= 
    "substring-after(., '[email protected]')"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at [email protected] for his email.</AUTHOR_CONTACT_INFORMATION> 

有用,正確的結果產生(與所有8個不同的XSLT處理器我手邊):

Plugin author can be reached at <a href="[email protected]">[email protected]</a> for his email. 
+0

我不知道這將如何幫助Dimitre。我在哪裏放置RegEx?可能我的問題並不清楚。我在原始帖子中添加了更多信息。你能重新閱讀嗎? – Sanjeev 2011-02-24 03:15:31

+0

@Sanjeev:我已經更新了我的答案,並提供了一種替代解決方案,可用於有問題的XSLT處理器。 – 2011-02-24 03:53:24

+0

@Dimitre:顯然,'[email protected]'不是我想要轉換爲超鏈接的唯一東西。這只是一個例子。我想轉換爲'href'的範圍從超鏈接到電子郵件地址,因此解決方案應該能夠使用正則表達式來查找並替換爲'href'標籤。同樣,可能有多個超鏈接和電子郵件地址。例如:作者的電子郵件地址是[email protected],他的網頁鏈接是[http://something.com/](http://something。com /) Sanjeev 2011-02-24 09:11:30