您好我已经看过做多插入文本和字符的解决方案,但是也无法弄清楚如何插入节点?
我为每个替换类型调用相同的替换函数,将结果保存在调用之间的变量中。第一次调用后的结果是树片段,因此下一次调用仅对文本部分起作用并跳过我刚刚添加的插入节点,因此只有最后一次替换才会生效。那么如何强制替换函数对树片段进行操作,就好像它只是纯文本一样?我使用Xslt V2。
源文字
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="file:///C:/projects/LOLA/Indesign/8-9069-32-010-3_IndesignPD/Stories/Untitled8.xsl" ?>
<file>
<Content>Em dash—</Content>
<Content>En dash–</Content>
<Content>discretionary hyphen</Content>
<Content>nonbreaking hyphen‑</Content>
<Content>READ THESE INSTRUCTIONS & THE</Content>
<Content>Tabs times 2</Content>
</file>
XSL
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:my="my:my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template name="Content">
<xsl:variable name="temp1">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="." />
<xsl:with-param name="replace" select="'­'" />
<xsl:with-param name="by">
<xsl:value-of select="'¬'" />
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- replace any ampersand characters-->
<xsl:variable name="temp2">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="$temp1" />
<xsl:with-param name="replace" select="'&'" />
<xsl:with-param name="by">
<![CDATA[&]]>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- horizontal tab -->
<xsl:variable name="temp3">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="$temp2" />
<xsl:with-param name="replace" select="'	'" />
<xsl:with-param name="by">
<xsl:value-of select="'→'" />
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$temp3" />
</xsl:template>
<xsl:template name="replace">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of disable-output-escaping="yes" select="substring-before($text,$replace)" />
<xsl:element name="replaced_text">
<xsl:element name="font">
<xsl:attribute name="color">red</xsl:attribute>
<xsl:value-of select="$by" />
</xsl:element>
</xsl:element>
<xsl:call-template name="replace">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我得到了什么
<?xml version="1.0" encoding="UTF-8"?>
Em dash—
En dash–
discretionary hyphen
nonbreaking hyphen‑
READ THESE INSTRUCTIONS & THE
Tabs times 2
我真正想要的是:
<?xml version="1.0" encoding="UTF-8"?>
Em dash—
En dash–
discretionary hyphen<font color="red">¬</font>
nonbreaking hyphen‑
READ THESE INSTRUCTIONS & THE
Tabs <font color="red">→</font> <font color="red">→</font>times 2