多替换节点

时间:2015-10-21 12:31:27

标签: xslt

您好我已经看过做多插入文本和字符的解决方案,但是也无法弄清楚如何插入节点?

我为每个替换类型调用相同的替换函数,将结果保存在调用之间的变量中。第一次调用后的结果是树片段,因此下一次调用仅对文本部分起作用并跳过我刚刚添加的插入节点,因此只有最后一次替换才会生效。那么如何强制替换函数对树片段进行操作,就好像它只是纯文本一样?我使用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 &amp; 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="'&#173;'" />
        <xsl:with-param name="by">
          <xsl:value-of select="'&#172;'" />
        </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="'&#38;'" />
        <xsl:with-param name="by">
          <![CDATA[&amp;]]>
        </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="'&#x9;'" />
        <xsl:with-param name="by">
          <xsl:value-of select="'&#8594;'" />
        </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 &amp; 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 &amp; THE
	Tabs <font color="red">→</font> <font color="red">→</font>times 2

0 个答案:

没有答案