我正在xml以下工作,我正在尝试转换为CSV输出。第一个元素组看起来不错,但第二个元素组有完整的名称元素,并且它有一个逗号。虽然转换它出现在下一栏引起问题。任何人都可以让我知道如何处理有逗号的元素吗?如何识别这些类型的元素并在其周围加上双引号? XSLT中有任何功能吗?非常感谢任何帮助
<?xml version="1.0" encoding="UTF-8"?>
<group>
<id>989898</id>
<firstname>steve</firstname>
<lastname>balmer</lastname>
<fullname>stevebalmer</fullname>
<company>Hoyaa</company>
</group>
<group>
<id>23342</id>
<firstname>gates</firstname>
<lastname>satya</lastname>
<fullname>gates,satya</fullname>
<company>Jessss</company>
</group>
<xsl:output method="text" omit-xml-declaration="yes"></xsl:output>
<xsl:template match="/">
<xsl:value-of select="/group/id"/>
<xsl:value-of select="/group/firstname"/>
<xsl:value-of select="/group/fullname"/>
<xsl:value-of select="/group/company"/>
</xsl:template>
答案 0 :(得分:1)
要仅包含包含带双引号的逗号的文本,您可以使用与谓词匹配所有text()
节点的模板:
<xsl:template match="group">
<xsl:apply-templates select="id|firstname|fullname|company"/>
</xsl:template>
<xsl:template match="text()[contains(.,',')]">
<xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
</xsl:template>
输出为:
989898stevestevebalmerHoyaa
23342gates"gates,satya"Jessss
要在每个项目后添加换行符,您必须为普通text()
节点添加单独的模板。
答案 1 :(得分:0)
不是识别值中包含comma
的特定元素,而只包含double quotes
中包含的元素,最好将double quotes
中的所有值分隔为comma
}。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:strip-space elements="*" />
<xsl:variable name="quot" select="'"'" />
<xsl:variable name="comma" select="','" />
<xsl:variable name="newline" select="'
'" />
<xsl:template match="group">
<xsl:for-each select="child::*">
<xsl:value-of select="concat($quot, ., $quot)" />
<xsl:if test="position() != last()">
<xsl:value-of select="$comma" />
</xsl:if>
<xsl:if test="position() = last()">
<xsl:value-of select="$newline" />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出
"989898","steve","balmer","stevebalmer","Hoyaa"
"23342","gates","satya","gates,satya","Jessss"
答案 2 :(得分:0)
使用我的XSLT处理器(xsltproc针对libxml 20706,libxslt 10126和libexslt 815编译)此代码:
<xsl:template match="/group">
"<xsl:value-of select="id"/>","<xsl:value-of select="firstname"/>","<xsl:value-of select="fullname"/>","<xsl:value-of select="company"/>"
</xsl:template>
给出了这个输出:
"989898","steve","stevebalmer","Hoyaa"
"23342","gates","gates,satya","Jessss"
(虽然我必须将组嵌套在周围的根标签中并相应地调整匹配器)