2010-07-01 75 views
2

需要哪些XSLT用雙引號括起相同的文本替換節點的文本:XSLT替換元素文本與封閉的文本價值

<users> 
    <user_info> 
    <lastname>Jenkins</lastname> 
    <firstname>Bob</firstname> 
    </user_info> 
    <user_info> 
    <lastname>Smith</lastname> 
    <firstname>Mike</firstname> 
    </user_info> 
</users> 

這是一個簡化的觀點,我USER_INFO結構有22種元素,所以我想在XSLT簡單地用雙引號括起來相同的文本替換任何子元素文本值的文本:

<users> 
    <user_info> 
    <lastname>"Jenkins"</lastname> 
    <firstname>"Bob"</firstname> 
    </user_info> 
    <user_info> 
    <lastname>"Smith"</lastname> 
    <firstname>"Mike"</firstname> 
    </user_info> 
</users> 

我可以做一個每個子元素的基礎上的邏輯,但那是乏味。我很困惑如何在user_info節點列表級別進行迭代。像往常一樣,答案可能非常簡單:)感謝您的幫助。

+0

問得好(+1)。請參閱我的答案,以獲得滿足最新要求的解決方案。 :) – 2010-07-01 23:10:05

回答

3

這種轉變

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

<xsl:variable name="vQ">"</xsl:variable> 

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

<xsl:template match="user_info/*/text()"> 
    <xsl:value-of select="concat($vQ, ., $vQ)"/> 
</xsl:template> 

<xsl:template match="user_info/*[not(node())]"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:value-of select="concat($vQ, $vQ)"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

當這個XML文檔施加:

<users> 
    <user_info> 
    <lastname>Jenkins</lastname> 
    <firstname>Bob</firstname> 
    <address2></address2> 
    </user_info> 
    <user_info> 
    <lastname>Smith</lastname> 
    <firstname>Mike</firstname> 
    </user_info> 
</users> 

產生通緝的結果

<users> 
    <user_info> 
    <lastname>"Jenkins"</lastname> 
    <firstname>"Bob"</firstname> 
    <address2>""</address2> 
    </user_info> 
    <user_info> 
    <lastname>"Smith"</lastname> 
    <firstname>"Mike"</firstname> 
    </user_info> 
</users> 
-1

我不知道該user_info//text()選擇的100%,但我認爲這會工作:

<xsl:template match="user_info//text()"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>"</xsl:text> 
</xsl:template> 

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

AJPerez,謝謝。它的確用雙引號括住了所有包含文本的值。我還需要雙引號爲空字符串,我可以添加什麼來獲得「」而不是? – Walinmichi 2010-07-01 21:38:03