我需要在XSLT 2样式表中进行一系列替换。例如,我需要将所有出现的“aaa”替换为“bbb”,将所有“ccc”替换为“ddd”。就普通replace
电话而言,我应该
<xsl:value-of select="replace(replace(text(), 'aaa', 'bbb'), 'ccc', 'ddd')"/>
然而,情况是我有数百个这样的替换对,为此我需要一个超长的select
属性。我想我可以使用例如Python脚本生成选择字符串,但它会很难看。是否有像XSLT那样的事情
<xsl:replace from="aaa" to="bbb"/>
<xsl:replace from="ccc" to="ddd"/>
…
这样XSLT更易读和可维护(并且可以机器操作)?
答案 0 :(得分:1)
你必须创建一个可以替换每个术语的函数
XSLT 2.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:funct="http://something"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="text()">
<xsl:value-of select="funct:textreplace($replaces/replaces/rep, .)"/>
</xsl:template>
<xsl:param name="replaces">
<replaces>
<rep from="aaa" to="bbb"/>
<rep from="ccc" to="ddd"/>
</replaces>
</xsl:param>
<xsl:function name="funct:textreplace" as="xs:string">
<xsl:param name="reps" as="element(rep)*"/>
<xsl:param name="text" as="xs:string"/>
<xsl:choose>
<xsl:when test="not($reps)">
<xsl:value-of select="$text"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="funct:textreplace($reps[position() gt 1], replace($text, $reps[1]/@from, $reps[1]/@to))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>