剥离XML中的Html标签<和>使用XSLT

时间:2015-02-26 09:19:43

标签: xml xslt

我的输入xml在Emp_Name和Country Elements中嵌入了HTML标记。我们的工具是阅读<>等HTML标记。我的XML可以在这两个字段上包含任何HTML标记。

我的要求是剥离这些HTML标记以获得以下所需的输出。 能否帮助您了解如何在XSLT中实现这一目标。

输入XML:

<root>
<Record>
<Emp_ID>288237</Emp_ID>
<Emp_Name> &lt;p&gt;John&lt;/p&gt;</Emp_Name>
<Country>&lt;p&gt;US&lt;/p&gt;</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>

1 个答案:

答案 0 :(得分:2)

基本上有两种方法可以解决这个问题:

  1. 将转义标记转换为真实标记,方法是输出disable-output-escaping="yes";序列化输出,并按照此问题的上一次迭代中所述处理结果:https://stackoverflow.com/a/28535511/3016153要&#34; 序列化输出&#34;,您需要将结果保存到一个新文件,并使用新文件作为输入启动另一个XSLT转换 - 除非您的处理器支持其他形式的序列化。

  2. 使用递归命名模板处理转义标记以删除标记。这很尴尬,如果文本包含的不仅仅是最基本的标记,那么很容易失败。以下是一个如何运作的示例:

  3. 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, '&lt;')">
                <xsl:value-of select="substring-before($string, '&lt;')" />
                <!-- recursive call -->
                <xsl:call-template name="remove-markup">
                    <xsl:with-param name="string" select="substring-after($string, '&gt;')"/>
                </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>