在XSLT元素中检查逗号

时间:2017-12-29 11:44:06

标签: xml xslt xslt-2.0 comma xslt-grouping

我正在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>
    

3 个答案:

答案 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="'&quot;'" />
    <xsl:variable name="comma" select="','" />
    <xsl:variable name="newline" select="'&#xD;'" />

    <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">
   &quot;<xsl:value-of select="id"/>&quot;,&quot;<xsl:value-of select="firstname"/>&quot;,&quot;<xsl:value-of select="fullname"/>&quot;,&quot;<xsl:value-of select="company"/>&quot;
</xsl:template>

给出了这个输出:

"989898","steve","stevebalmer","Hoyaa"
"23342","gates","gates,satya","Jessss"

(虽然我必须将组嵌套在周围的根标签中并相应地调整匹配器)