如何阻止XSLT转换过程中HTML标签被剥离?
解决XSLT提取内容时丢失HTML标签的问题
你的XSLT代码里,用<xsl:value-of>提取job_intro、location_description等节点内容时,会自动剥离里面的HTML标签(比如<h3>、<p>),只留纯文本,导致招聘帖格式混乱。问题出在这段代码:
<member> <name>description</name> <value> <xsl:value-of select="job_intro" /> <xsl:value-of select="location_description" /> <xsl:value-of select="job_description" /> <xsl:value-of select="brand_desc" /> </value> </member>
解决方法
<xsl:value-of>的作用是提取节点的纯文本内容,要保留节点内的所有子元素(包括HTML标签),得换成<xsl:copy-of>——它会完整复制指定节点的所有内容,包括子节点、属性和文本。
修改后的代码段如下:
<member> <name>description</name> <value> <xsl:copy-of select="job_intro/node()" /> <xsl:copy-of select="location_description/node()" /> <xsl:copy-of select="job_description/node()" /> <xsl:copy-of select="brand_desc/node()" /> </value> </member>
完整修改后的XSLT代码
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> <xsl:param name="transaction"/> <xsl:param name="adtype"/> <xsl:param name="testmode"/> <xsl:param name="username"/> <xsl:param name="password"/> <xsl:variable name="apos" select='"&apos;"'/> <xsl:output method = "xml" omit-xml-declaration="no" encoding="iso-8859-1" indent="yes"/> <xsl:template match="pb_ad"> <xsl:if test="$transaction!='DELETE'"> <methodCall> <methodName>submitJob</methodName> <params> <param><value><struct> <member><name>source</name><value><i4>76</i4></value></member> <member> <name>username</name> <value> <string> <xsl:choose> </xsl:choose> </string> </value> </member> <member> <name>password</name> <value> <string> <xsl:choose> </xsl:choose> </string> </value> </member> <member><name>reference</name><value><i4><xsl:value-of select="@id" /></i4></value></member> <member><name>title</name><value><string><xsl:value-of select="headline"/></string></value></member> <member><name>industry</name><value><i4>27</i4></value></member> <member><name>type</name><value><string> <xsl:choose> <xsl:when test="employment_term_id=2">contract</xsl:when> <xsl:when test="employment_term_id=5">temporary</xsl:when> <xsl:when test="employment_term_id=6">part_time</xsl:when> <xsl:otherwise>permanent</xsl:otherwise> </xsl:choose> </string></value></member> <member><name>salary_min</name><value><i4><xsl:value-of select="salaryfrom"/></i4></value></member> <member><name>salary_max</name><value><i4><xsl:value-of select="salaryto"/></i4></value></member> <member><name>salary_period</name><value><i4> <xsl:choose> <xsl:when test="pay_period_id=2">405</xsl:when> <xsl:when test="pay_period_id=3">406</xsl:when> <xsl:when test="pay_period_id=4">407</xsl:when> <xsl:when test="pay_period_id=5">404</xsl:when> <xsl:otherwise>403</xsl:otherwise> </xsl:choose> </i4></value></member> <member><name>salary_info</name><value><string><xsl:value-of select="job_salary"/></string></value></member> <member><name>region</name><value><i4><xsl:value-of select="locations_mapped/location"/></i4></value></member> <member><name>display_location</name><value><string><xsl:value-of select="hotel"/></string></value></member> <member><name>precise_location</name><value><string><xsl:value-of select="postcode"/></string></value></member> <member><name>description</name><value> <xsl:copy-of select="job_intro/node()" /> <xsl:copy-of select="location_description/node()" /> <xsl:copy-of select="job_description/node()" /> <xsl:copy-of select="brand_desc/node()" /> </value></member> <xsl:if test="apply_online_url!=''"> <member><name>external_url</name><value><string><xsl:value-of select="apply_online_url"/></string></value></member> <member><name>contact_name</name><value><string><xsl:value-of select="contact_first_name"/><xsl:text> </xsl:text><xsl:value-of select="contact_last_name"/></string></value></member> <member><name>contact_telephone</name><value><string></string></value></member> <member><name>contact_email</name><value><string></string></value></member> </xsl:if> <xsl:if test="apply_online_url=''"> <member><name>contact_name</name><value><string><xsl:value-of select="contact_first_name"/><xsl:text> </xsl:text><xsl:value-of select="contact_last_name"/></string></value></member> <member><name>contact_telephone</name><value><string><xsl:value-of select="contact_work_phone"/></string></value></member> <member><name>contact_email</name><value><string><xsl:value-of select="email"/></string></value></member> </xsl:if> <member><name>direct_apply_url</name><value><string></string></value></member> <member><name>direct_apply_jobid</name><value><string><xsl:value-of select="@id"/></string></value></member> <member><name>all_industries</name><value><i4>0</i4></value></member> </struct></value> </param> </params> </methodCall> </xsl:if> </xsl:template> </xsl:stylesheet>
补充说明
<xsl:copy-of select="节点名/node()"/>会复制该节点下的所有子元素和文本,完美保留原有的HTML格式。- 如果你的源XML中,
job_intro等节点本身包含HTML标签作为子节点,用这个方法就能解决格式丢失的问题。
内容的提问来源于stack exchange,提问作者user794846
相关产品推荐
相关产品推荐

