我正在尝试使用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="'
'" />
<xsl:variable name="tab" select="'	'" />
<xsl:variable name="comma" select="','" />
<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 :(得分: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-templates
和with-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.