【问题标题】:how to replace comma with space in an xml element using xslt如何使用xslt在xml元素中用空格替换逗号
【发布时间】:2013-09-03 05:57:36
【问题描述】:

我有以下 xml:

<!-- language: lang-xml -->

<Report_Entry>
<Employee_ID> 1 </Employee_ID>
<First_Name>John</First_Name>
<Last_Name>Smith</Last_Name>
<Primary_Address>4200 Holly Hall Street, #18</Primary_Address>
<Hire_Date>2000-01-02-08:00</Hire_Date>
</Report_Entry>

<Report_Entry>
<Employee_ID> 2 </Employee_ID>
<First_Name>Julie</First_Name>
<Last_Name>Ray</Last_Name>
<Primary_Address>255 Gregor Street</Primary_Address>
<Hire_Date>2000-05-01-08:00</Hire_Date>
</Report_Entry>

我有 500 个这样的报告条目元素。我希望输出为:

1, John, Smith, 4200 Holly Hall Street #18, 01-02-2000
2,朱莉,雷,格雷戈尔街 255 号,2000 年 5 月 1 日
等等……

这是我为转换上述 XML 而编写的 XSLT 代码:

<!-- language: lang-xslt -->
<xsl:template match="Report_Entry">
<xsl:for-each select="*">
     <xsl:value-of select="."/>
          <xsl:if test="position() != last()">
              <xsl:value-of select="','"/>
          </xsl:if>
</xsl:for-each>
<xsl:text>&#10;</xsl:text>   

</xsl:template>

我无法完成两件事:

  1. 我想用空格替换 Primary_Address 元素中的每个逗号
  2. 将 Hire_Date 元素的日期格式更改为所需格式 (mm-dd-yyyy)

如果有人能帮助我解决上述两个问题,我将不胜感激.....

【问题讨论】:

  • 检查this SO post 是否对第一项有帮助。
  • @Harry Hey Harry,我无法理解您建议的链接中的代码。请告诉我如何对现有的 xslt 进行更改?

标签: xml xslt


【解决方案1】:

要将逗号替换为空格,您可以使用translate 函数。

<xsl:value-of select="translate(., ',', ' ')"/>

但请注意,如果您以前没有见过此功能,因为它的工作方式与普通的“替换”功能不同。它仅将单个字符转换为其他字符。它不会用其他字符串替换匹配的字符串。 (注意,如果您使用的是 XSLT 2.0,则有一个“替换”功能可用)。

至于格式化日期,您可以在这里使用 substring 函数重新排列字段,假设 Hire_Date 始终采用相同的格式。

 <xsl:value-of select="concat(substring(., 6, 2), '-', substring(., 9, 2), '-' , substring(., 1, 4))"/>

有一点需要注意,可能值得重新安排 XSLT 以使用模板而不是 xsl:for-each。这将有助于为 Hire_Date 编写代码,就像它在自己的模板中一样。此外,如果 Hire_Date 始终是最后一个元素,这将允许您放弃对该职位的 xsl:if 测试。

试试这个 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="Report_Entry">
    <xsl:apply-templates select="*" />
    <xsl:text>&#10;</xsl:text>
  </xsl:template>

  <xsl:template match="Report_Entry/*[not(self::Hire_Date)]">
    <xsl:value-of select="translate(., ',', ' ')"/>
    <xsl:value-of select="','"/>
  </xsl:template>

  <xsl:template match="Hire_Date">
    <xsl:value-of select="concat(substring(., 6, 2), '-', substring(., 9, 2), '-' , substring(., 1, 4))"/>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2011-03-29
    • 1970-01-01
    • 2014-03-11
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多