如何使用xslt在xml元素中用空格替换逗号

时间:2013-09-03 05:57:37

标签: xml xslt

我有以下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>,约翰,史密斯,4200 Holly Hall Street#18,01-02-2000
  2,Julie,Ray,255 Gregor Street,05-01-2000
  等等......

以下是我编写的用于转换上述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. 我想用空格
  2. 替换Primary_Address元素中的每个逗号
  3. 将Hire_Date元素的日期格式更改为所需格式(mm-dd-yyyy)
  4. 如果有人能帮助我解决上述两个问题,我将不胜感激......

1 个答案:

答案 0 :(得分:1)

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

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

要小心,如果你之前没有看过这个函数,因为它的工作方式与普通的'replace'函数完全不同。它只将单个字符转换为其他字符。它不会将匹配的字符串替换为其他字符串。 (注意,如果您使用的是XSLT 2.0,则可以使用'替换'功能。)

至于格式化日期,您可以使用此处的子字符串函数来重新确定字段,假设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>