如何使用XSLT为XML的每条experience记录添加ID与name并分行输出
解决方案
这里有一份能满足你需求的XSLT代码,它会将每份experience记录与对应的ID、姓名组合,每条单独占一行输出:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vb="http://example.com/vb"> <!-- 声明XML中使用的vb命名空间 --> <xsl:output method="text" encoding="UTF-8"/> <!-- 指定输出为纯文本格式 --> <xsl:template match="/vb:Report"> <!-- 先获取全局的ID和name值,避免重复查询 --> <xsl:variable name="reportId" select="normalize-space(vb:ID)"/> <xsl:variable name="reportName" select="normalize-space(vb:name)"/> <!-- 遍历每一条experience记录 --> <xsl:for-each select="vb:experience"> <!-- 按顺序输出字段,用空格分隔,normalize-space清理前后空白 --> <xsl:value-of select="$reportId"/> <xsl:text> </xsl:text> <xsl:value-of select="$reportName"/> <xsl:text> </xsl:text> <xsl:value-of select="normalize-space(vb:title)"/> <xsl:text> </xsl:text> <xsl:value-of select="normalize-space(vb:company)"/> <xsl:text> </xsl:text> <xsl:value-of select="normalize-space(vb:startend)"/> <xsl:text> </xsl:text> <!-- 添加换行符,实现每条记录单独一行 --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键说明:
- 命名空间处理:你的XML使用了
vb前缀,所以XSLT必须声明对应的命名空间才能正确匹配节点(这里的命名空间URI可以自定义,只要和XML中的一致即可;如果你的XML没有显式定义命名空间,保持这个声明也能正常工作) - 空白清理:使用
normalize-space()可以自动去除字段前后的多余空格(比如你输入中Consultant2前面的空格、company标签周围的空格),让输出更整洁 - 文本输出:通过
<xsl:output method="text"/>确保输出是纯文本格式,没有XML标签
修正后的输入XML(注意XML大小写敏感,统一了标签闭合的大小写):
<vb:Report xmlns:vb="http://example.com/vb"> <vb:ID>1111</vb:ID> <vb:name>tinker bell</vb:name> <vb:experience> <vb:title>Consultant1</vb:title> <vb:company>Coke</vb:company> <vb:startend>04/01 - 04/30</vb:startend> </vb:experience> <vb:experience> <vb:title> Consultant2</vb:title> <vb:company>Pepsi</vb:company> <vb:startend>05/01 - 04/30</vb:startend> </vb:experience> </vb:Report>
最终输出:
1111 tinker bell Consultant1 Coke 04/01 - 04/30 1111 tinker bell Consultant2 Pepsi 05/01 - 04/30
内容的提问来源于stack exchange,提问作者vader
相关产品推荐
相关产品推荐

