我的输入xml在Emp_Name和Country Elements中嵌入了HTML标记。我们的工具是阅读<
和>
等HTML标记。我的XML可以在这两个字段上包含任何HTML标记。
我的要求是剥离这些HTML标记以获得以下所需的输出。 能否帮助您了解如何在XSLT中实现这一目标。
输入XML:
<root>
<Record>
<Emp_ID>288237</Emp_ID>
<Emp_Name> <p>John</p></Emp_Name>
<Country><p>US</p></Country>
<Manager>Wills</Manager>
<Join_Date>5/12/2014</Join_Date>
<Experience>9 years</Experience>
<Project>abc</Project>
<Skill>java</Skill>
</Record>
</root>
期望的输出:
<root>
<Record>
<Emp_ID>288237</Emp_ID>
<Emp_Name>John</Emp_Name>
<Country>US</Country>
<Manager>Wills</Manager>
<Join_Date>5/12/2014</Join_Date>
<Experience>9 years</Experience>
<Project>abc</Project>
<Skill>java</Skill>
</Record>
</root>
答案 0 :(得分:2)
基本上有两种方法可以解决这个问题:
将转义标记转换为真实标记,方法是输出disable-output-escaping="yes"
;序列化输出,并按照此问题的上一次迭代中所述处理结果:https://stackoverflow.com/a/28535511/3016153要&#34; 序列化输出&#34;,您需要将结果保存到一个新文件,并使用新文件作为输入启动另一个XSLT转换 - 除非您的处理器支持其他形式的序列化。
使用递归命名模板处理转义标记以删除标记。这很尴尬,如果文本包含的不仅仅是最基本的标记,那么很容易失败。以下是一个如何运作的示例:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Emp_Name|Country">
<xsl:copy>
<xsl:call-template name="remove-markup">
<xsl:with-param name="string" select="."/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="remove-markup">
<xsl:param name="string"/>
<xsl:choose>
<xsl:when test="contains($string, '<')">
<xsl:value-of select="substring-before($string, '<')" />
<!-- recursive call -->
<xsl:call-template name="remove-markup">
<xsl:with-param name="string" select="substring-after($string, '>')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
应用于您的输入,结果是:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Record>
<Emp_ID>288237</Emp_ID>
<Emp_Name> John</Emp_Name>
<Country>US</Country>
<Manager>Wills</Manager>
<Join_Date>5/12/2014</Join_Date>
<Experience>9 years</Experience>
<Project>abc</Project>
<Skill>java</Skill>
</Record>
</root>