XSLT将元素文本替换为包含的文本值

XSLT将元素文本替换为包含的文本值,xslt,Xslt,用双引号中的相同文本替换节点的文本需要什么XSLT: <users> <user_info> <lastname>Jenkins</lastname> <firstname>Bob</firstname> </user_info> <user_info> <lastname>Smith</lastname> <firstname

用双引号中的相同文本替换节点的文本需要什么XSLT:

<users>
  <user_info>
    <lastname>Jenkins</lastname>
    <firstname>Bob</firstname>
  </user_info>
  <user_info>
    <lastname>Smith</lastname>
    <firstname>Mike</firstname>
  </user_info>
</users>
<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>
<users>
  <user_info>
    <lastname>"Jenkins"</lastname>
    <firstname>"Bob"</firstname>
  </user_info>
  <user_info>
    <lastname>"Smith"</lastname>
    <firstname>"Mike"</firstname>
  </user_info>
</users>

“詹金斯”
“鲍勃”
“史密斯”
“迈克”

我可以在每个子元素的基础上执行逻辑,但这很乏味。我对如何在用户信息节点列表级别进行迭代感到困惑。像往常一样,答案可能很简单:)谢谢你的帮助。

我对
用户信息//文本()
选择器不是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>

"
"

此转换:

<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>
<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>

"
应用于此XML文档时

<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>
<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>

詹金斯
上下快速移动
史密斯
迈克
产生想要的结果

<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>
<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>

“詹金斯”
“鲍勃”
""
“史密斯”
“迈克”

AJPerez,谢谢。它确实用双引号括住了文本中的所有值。我还需要用双引号括住空字符串,我可以添加什么来获得“”,而不是?好问题(+1)。请参阅我的答案,以获得满足您最新要求的解决方案。:)