使用XSLT将Commas替换为SPace

时间:2013-11-25 13:44:08

标签: xml xslt csv translate

我正在尝试使用xslt从我的xml文件中删除逗号。 如何用空格正确替换节点或属性值中包含的任何逗号?

这是我的xslt文件:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc">
    <xsl:output method="text" encoding="utf-8" media-type="text/plain" />
    <xsl:strip-space  elements="*"/>

<xsl:variable name="newline" select="'&#x0A;'" />
<xsl:variable name="tab" select="'&#x09;'" />
<xsl:variable name="comma" select="'&#x2C;'" />
<xsl:variable name="padding" select="'                              '" /> <!-- 30 spaces for padding -->

<!-- Longest Column Header Text is 39 letters long -->
<xsl:variable name="FAO" select="concat('FAO', $padding, $padding)" />
<xsl:variable name="FAO1" select="concat('FAO REFERENCE ID', '')" />
<xsl:variable name="FAO2" select="concat('FAO TYPE', $padding)" />
<xsl:variable name="RESP" select="concat('RESPONSIBLE PERSON', $padding, $padding, $padding, $padding)" />


<xsl:template match="/">
<!--        <xsl:variable name="textVal" select="*/text()" />  
        <xsl:value-of select="translate($textVal, ',' ,' ')" />-->
    <xsl:value-of select="$FAO"/><xsl:value-of select="$comma"/>
    <xsl:value-of select="$FAO1"/><xsl:value-of select="$comma"/>
    <xsl:value-of select="$FAO2"/><xsl:value-of select="$comma"/>
    <xsl:value-of select="$RESP"/><xsl:value-of select="$comma"/>
<xsl:value-of select="$newline"/>

    <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
        <xsl:value-of select="substring(concat(wd:FAO, $padding, $padding, $padding, $padding, $padding), 1, string-length($FAO))" /><xsl:value-of select="$comma"/>
        <xsl:value-of select="substring(concat(wd:FAO_REFERENCE_ID, $padding, $padding, $padding, $padding, $padding), 1, string-length($FAO1))" /><xsl:value-of select="$comma"/>
        <xsl:value-of select="substring(concat(wd:FAO_TYPE, $padding, $padding, $padding, $padding, $padding), 1, string-length($FAO2))" /><xsl:value-of select="$comma"/>
        <xsl:value-of select="substring(concat(wd:RESPONSIBLE_PERSON/@wd:Descriptor, $padding, $padding, $padding, $padding, $padding), 1, string-length($RESP))" /><xsl:value-of select="$comma"/>
    </xsl:for-each>
</xsl:template>

<xsl:template match="*">
    <xsl:variable name="textVal" select="*/text()" />  
    <xsl:value-of select="translate($textVal, ',' ,' ')" />
</xsl:template>

</xsl:stylesheet>

我的输出是一个CSV文件,所以我想替换包含带空格的逗号的任何节点和属性值。

尝试用空格替换逗号的第二个模板不起作用。 我也尝试将这两个语句放在第一个模板的开头,但是效果不好。

3 个答案:

答案 0 :(得分:1)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc">
    <xsl:output method="text" encoding="utf-8" media-type="text/plain" />
    <xsl:strip-space  elements="*"/>

<xsl:template match="@*|node()">
    <xsl:for-each select="@*|text()">
        <xsl:variable name="textVal" select="current()" />  
        <xsl:value-of select="translate($textVal, ',' ,' ')" />
    </xsl:for-each>
    <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

translate()模板中的*不会执行任何操作,因为该模板永远不会被使用 - 您的template match="/"只会执行一系列value-of指令,而不会调用apply-templates导致*模板触发。

您需要将翻译单独放在每个value-of中,例如

<xsl:value-of select="translate(substring(concat(wd:FAO,$padding, $padding,
    $padding, $padding, $padding), 1, string-length($FAO)), ',', ' ')" />

如果这是XSLT 2.0,你可以定义一个自定义函数来缩短它,但是在XSLT 1.0中你必须使用apply-templateswith-param,这可能至少可以解决这个问题。作为替代方案。

<xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
    <xsl:apply-templates select="wd:FAO">
      <xsl:with-param name="header" select="$FAO"/>
    </xsl:apply-templates>
    <xsl:value-of select="$comma"/>
    <xsl:apply-templates select="wd:FAO_REFERENCE_ID">
      <xsl:with-param name="header" select="$FAO1"/>
    </xsl:apply-templates>
    <xsl:value-of select="$comma"/>
    <xsl:apply-templates select="wd:FAO_TYPE">
      <xsl:with-param name="header" select="$FAO2"/>
    </xsl:apply-templates>
    <xsl:value-of select="$comma"/>
    <!-- etc -->
</xsl:for-each>

使用以下模板

<xsl:template match="wd:*">
    <xsl:param name="header" />
    <xsl:value-of select="translate(substring(concat(., $padding, $padding,
      $padding, $padding, $padding), 1, string-length($header)), ',', ' ')" />
</xsl:template>

答案 2 :(得分:1)

如果您使用的是XSLT 2.0,则可以使用xsl:character-map

示例...

XML输入

<test>Bacon ipsum dolor sit amet sirloin, venison, swine, 
    ground round, pastrami, rump pig, kevin turducken.</test>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" use-character-maps="map"/>

    <xsl:character-map name="map">
        <xsl:output-character character="," string=" "/>
    </xsl:character-map>

</xsl:stylesheet>

文字输出

Bacon ipsum dolor sit amet sirloin  venison  swine  
    ground round  pastrami  rump pig  kevin turducken.