XSLT用封闭的文本值替换元素文本

时间:2010-07-01 20:05:35

标签: 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节点列表级别进行迭代感到困惑。像往常一样,答案可能非常简单:)感谢您的帮助。

2 个答案:

答案 0 :(得分: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 :(得分:-1)

我不是100%确定user_info//text()选择器,但我认为这样可行:

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