我创建了一个XSLT转换,以提取XML值并将其隐蔽为CSV。这种转换效果很好;但是,特定值具有我需要处理的转义字符。
我总共提取大约20个不同的值,并将它们输出为CSV中的单独字段。我只希望在三个字段中使用转义符(逗号,换行符和引号)。
下面是代码示例:
<xsl:for-each select="metadata">
<xsl:value-of select="concat('"', (./Identifiers/Identifier/IDone), '"')"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="concat('"', (./Identifiers/Identifier/IDtwo), '"')"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="concat('"', string-join(./Identifiers/Identifier/IDthree, '|'), '"')"/>
<xsl:text>,</xsl:text>
</xsl:for-each>
</xsl:template>
在寻找解决方案后,我在下面看到了这个模板。任何有关如何最好地适应以下/应对这些逃生的建议,将不胜感激。
<!-- Helper for escaping CSV field -->
<xsl:template name="escape_quotes">
<xsl:param name="string" />
<xsl:value-of select="substring-before($string, '"' )" />
<xsl:text>""</xsl:text>
<xsl:variable name="substring_after_first_quote" select="substring-after( $string, '"' )" />
<xsl:choose>
<xsl:when test="not(contains( $substring_after_first_quote, '"' ) )">
<xsl:value-of select="$substring_after_first_quote" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="escape_quotes">
<xsl:with-param name="string" select="$substring_after_first_quote"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>