我有以下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> </xsl:text>
</xsl:template>
我无法完成两件事:
如果有人能帮助我解决上述两个问题,我将不胜感激......
答案 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> </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>