2013-11-25 82 views
0

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

这里是我的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文件,所以我想替换的任何节点和属性包含有空格逗号值。

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

+0

可能的重复http://stackoverflow.com/questions/10898952/how-to-replace-commas-with-spaces-in-xsl?rq=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> 
+0

我用你发布的第一种方法,通过应用翻译到每个值。谢谢 – RXC

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

如果您使用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.