2010-07-01 42 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