xslt 1.0 转义带有嵌入 html 的撇号文本
xslt 1.0 escape apostrophe text with embedded html
我正在尝试转义出现在还包含嵌入 html 标记的文本中的撇号。
我的 XML 看起来像:
<segment code="ASDF"> ...
<text> <a href="asdf.aspx?lfn=GYPT_0&u=0" >[ blah] </a> 08:57:11 02 OCT 2013<br /><b>blah</b> <br /> blah ...<br /><br /> About <a href="EEEERE.aspx?lfn=MAB_0&u=0" ><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] </text> </segment>
我可以将所有这些内容提取为单个字符串(包括所有 html 标记及其内容):
<xsl:template match="text" >
, text:'<xsl:copy-of select='node()' />'
</xsl:template>
请注意 周围的撇号 - 本练习的结果是 JSON,当然,这个特定的 JSON 将失败,因为 不能.
感谢您尝试理解!!
我试图完成的最终结果如下所示:
text:'<a href="asdf.aspx?lfn=GYPT_0&u=0" >[ blah] </a> 08:57:11 02 OCT 2013<br /><b>blah</b> <br /> blah ...<br /><br /> About <a href="EEEERE.aspx?lfn=MAB_0&u=0" ><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ]'
( 我正在从 xml(其中包含 html 标记作为字符串)转换为 JSON 对象(包含 html 标记的字符串), 由于 value 是一个字符串,它被单引号括起来,所以任何嵌入的单引号都需要转义为 javascript, in浏览器将正确显示的表单。)
迈克尔 - 我试过你的代码 - 复制并粘贴到我的样式表中。产品总是什么都没有——一个空字符串。我也试过像这样使用 translate() 函数:
translate(node(),"'","&apos;"), which also produces an empty string.
我在样式表中使用 Michael 的解决方案所做的具体更改是更改:
<xsl:with-param name="string" select="."/>
to
<xsl:with-param name="string" select="node()"/>
。不起作用,因为翻译器将嵌入的 html 标签视为附加节点,因此不会返回它们的内容。 node() 语句(指定了
(根据您的说明进行编辑)
您尝试将 '
转换为 &apos;
是朝着正确方向迈出的一步。但是,您不能为此使用 translate() 函数。 translate 函数将每个单个字符替换为另一个单个字符。在你的例子中:
translate($string, "'", "&apos;")
输入 $string 中的任何撇号字符都将被转换为(转义的)&符号(替换字符串中的第一个字符)。
您需要在此处使用的工具是一个递归命名模板,它将输入字符串中每次出现的撇号替换为表示转义撇号的字符串(包含多个字符)。
并且,由于最后您希望输出包含 '
而不是 &apos;
,因此您必须将结果写入禁用转义的输出。
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text">
<xsl:text>text:'</xsl:text>
<xsl:apply-templates/>
<xsl:text>'</xsl:text>
</xsl:template>
<xsl:template match="text/text()">
<xsl:call-template name="replace">
<xsl:with-param name="string" select="."/>
<xsl:with-param name="search-string">'</xsl:with-param>
<xsl:with-param name="replace-string">&apos;</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="string"/>
<xsl:param name="search-string"/>
<xsl:param name="replace-string"/>
<xsl:choose>
<xsl:when test="contains($string, $search-string)">
<xsl:value-of select="substring-before($string, $search-string)"/>
<xsl:value-of select="$replace-string" disable-output-escaping="yes"/>
<xsl:call-template name="replace">
<xsl:with-param name="string" select="substring-after($string, $search-string)"/>
<xsl:with-param name="search-string" select="$search-string"/>
<xsl:with-param name="replace-string" select="$replace-string"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当应用于您时示例输入:
XML
<segment code="ASDF"> ...
<text> <a href="asdf.aspx?lfn=GYPT_0&u=0" >[ blah] </a> 08:57:11 02 OCT 2013<br /><b>blah</b> <br /> blah ...<br /><br /> About <a href="EEEERE.aspx?lfn=MAB_0&u=0" ><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] </text> </segment>
将产生这个结果:
<segment code="ASDF"> ...
text:'<a href="asdf.aspx?lfn=GYPT_0&u=0">[ blah] </a> 08:57:11 02 OCT 2013<br/><b>blah</b><br/> blah ...<br/><br/> About <a href="EEEERE.aspx?lfn=MAB_0&u=0"><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] '</segment>
如果您不想要 segment
包装器元素,请向样式表再添加一个模板:
<xsl:template match="segment">
<xsl:apply-templates select="text"/>
</xsl:template>
得到这个结果:
text:'<a href="asdf.aspx?lfn=GYPT_0&u=0">[ blah] </a> 08:57:11 02 OCT 2013<br/><b>blah</b><br/> blah ...<br/><br/> About <a href="EEEERE.aspx?lfn=MAB_0&u=0"><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] '
我相信这等于“我试图完成的最终结果”,给予或接受 space。
我正在尝试转义出现在还包含嵌入 html 标记的文本中的撇号。 我的 XML 看起来像:
<segment code="ASDF"> ...
<text> <a href="asdf.aspx?lfn=GYPT_0&u=0" >[ blah] </a> 08:57:11 02 OCT 2013<br /><b>blah</b> <br /> blah ...<br /><br /> About <a href="EEEERE.aspx?lfn=MAB_0&u=0" ><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] </text> </segment>
我可以将所有这些内容提取为单个字符串(包括所有 html 标记及其内容):
<xsl:template match="text" >
, text:'<xsl:copy-of select='node()' />'
</xsl:template>
请注意
感谢您尝试理解!! 我试图完成的最终结果如下所示:
text:'<a href="asdf.aspx?lfn=GYPT_0&u=0" >[ blah] </a> 08:57:11 02 OCT 2013<br /><b>blah</b> <br /> blah ...<br /><br /> About <a href="EEEERE.aspx?lfn=MAB_0&u=0" ><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ]'
( 我正在从 xml(其中包含 html 标记作为字符串)转换为 JSON 对象(包含 html 标记的字符串), 由于 value 是一个字符串,它被单引号括起来,所以任何嵌入的单引号都需要转义为 javascript, in浏览器将正确显示的表单。)
迈克尔 - 我试过你的代码 - 复制并粘贴到我的样式表中。产品总是什么都没有——一个空字符串。我也试过像这样使用 translate() 函数:
translate(node(),"'","&apos;"), which also produces an empty string.
我在样式表中使用 Michael 的解决方案所做的具体更改是更改:
<xsl:with-param name="string" select="."/>
to
<xsl:with-param name="string" select="node()"/>
。不起作用,因为翻译器将嵌入的 html 标签视为附加节点,因此不会返回它们的内容。 node() 语句(指定了
(根据您的说明进行编辑)
您尝试将 '
转换为 &apos;
是朝着正确方向迈出的一步。但是,您不能为此使用 translate() 函数。 translate 函数将每个单个字符替换为另一个单个字符。在你的例子中:
translate($string, "'", "&apos;")
输入 $string 中的任何撇号字符都将被转换为(转义的)&符号(替换字符串中的第一个字符)。
您需要在此处使用的工具是一个递归命名模板,它将输入字符串中每次出现的撇号替换为表示转义撇号的字符串(包含多个字符)。
并且,由于最后您希望输出包含 '
而不是 &apos;
,因此您必须将结果写入禁用转义的输出。
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text">
<xsl:text>text:'</xsl:text>
<xsl:apply-templates/>
<xsl:text>'</xsl:text>
</xsl:template>
<xsl:template match="text/text()">
<xsl:call-template name="replace">
<xsl:with-param name="string" select="."/>
<xsl:with-param name="search-string">'</xsl:with-param>
<xsl:with-param name="replace-string">&apos;</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="string"/>
<xsl:param name="search-string"/>
<xsl:param name="replace-string"/>
<xsl:choose>
<xsl:when test="contains($string, $search-string)">
<xsl:value-of select="substring-before($string, $search-string)"/>
<xsl:value-of select="$replace-string" disable-output-escaping="yes"/>
<xsl:call-template name="replace">
<xsl:with-param name="string" select="substring-after($string, $search-string)"/>
<xsl:with-param name="search-string" select="$search-string"/>
<xsl:with-param name="replace-string" select="$replace-string"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当应用于您时示例输入:
XML
<segment code="ASDF"> ...
<text> <a href="asdf.aspx?lfn=GYPT_0&u=0" >[ blah] </a> 08:57:11 02 OCT 2013<br /><b>blah</b> <br /> blah ...<br /><br /> About <a href="EEEERE.aspx?lfn=MAB_0&u=0" ><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] </text> </segment>
将产生这个结果:
<segment code="ASDF"> ...
text:'<a href="asdf.aspx?lfn=GYPT_0&u=0">[ blah] </a> 08:57:11 02 OCT 2013<br/><b>blah</b><br/> blah ...<br/><br/> About <a href="EEEERE.aspx?lfn=MAB_0&u=0"><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] '</segment>
如果您不想要 segment
包装器元素,请向样式表再添加一个模板:
<xsl:template match="segment">
<xsl:apply-templates select="text"/>
</xsl:template>
得到这个结果:
text:'<a href="asdf.aspx?lfn=GYPT_0&u=0">[ blah] </a> 08:57:11 02 OCT 2013<br/><b>blah</b><br/> blah ...<br/><br/> About <a href="EEEERE.aspx?lfn=MAB_0&u=0"><b>breathing</b></a>: blah
you "can't do" an ...[ more of the same ] '
我相信这等于“我试图完成的最终结果”,给予或接受 space。