如何通过XSLT转换过滤输入文件中多余的<li>标签
问题原因
你遇到的多余<li>标签,根源有两个:
- XSLT默认模板的自动输出:输入里
xhtml:ol[@property='ktp:questionSet']下的三个原生<li>(ktp-question-set-meta、ktp-stimulus、ktp-question)没有被你的自定义模板匹配,被默认模板直接输出到结果里。 - 全局路径的匹配冗余:你用了大量
//开头的绝对路径,会匹配整个文档内的对应节点,容易导致重复输出内容。
解决方案
1. 拦截原生多余<li>
添加一个空模板,直接阻止输入中不需要的<li>元素被输出:
<xsl:template match="xhtml:li[@class='ktp-question-set-meta' or @class='ktp-stimulus' or @class='ktp-question']" />
2. 替换全局路径为相对路径
把模板中所有//开头的select路径,改成基于当前匹配的ol节点的相对路径,确保只取当前问题集下的内容,避免全局匹配的冗余。
修改后的完整模板:
<xsl:template match="xhtml:ol[@property = 'ktp:questionSet']"> <xsl:param name="path"/> <xsl:variable name="content-item-name" select=".//xhtml:span[@property = 'atom:content-item-name']/@data-value"/> <li class="ktp-question" property="ktp:question" typeof="ktp:Question"> <section class="ktp-question-set-meta"> <xsl:apply-templates select="./xhtml:li[@class='ktp-question']/xhtml:section[@class='ktp-question-meta']/xhtml:section[@class='ktp-meta' and not(@property = 'ktp:questionSetType')][position() = 3 or position() = 4]"/> </section> <section property="ktp:stimulus" typeof="ktp:Stimulus" class="ktp-stimulus"> <xsl:apply-templates select="xhtml:li[@class = 'ktp-stimulus']/node()"/> </section> <section class="ktp-question-stem"> <xsl:apply-templates select="./xhtml:li[@class='ktp-question']/xhtml:section[@class='ktp-question-stem']/node()"/> </section> <ol class="ktp-answer-set"> <xsl:apply-templates select="./xhtml:li[@class='ktp-question']/xhtml:ol[@class='ktp-answer-set']/node()"/> </ol> <section property="ktp:explanation" typeof="ktp:Explanation" class="ktp-explanation"> <xsl:apply-templates select="./xhtml:li[@class='ktp-question']/xhtml:section[@class='ktp-explanation']/node()"/> </section> </li> </xsl:template> <!-- 拦截原生多余li --> <xsl:template match="xhtml:li[@class='ktp-question-set-meta' or @class='ktp-stimulus' or @class='ktp-question']" />
关键修改说明
- 用
./开头的相对路径,限定只在当前匹配的ol节点下查找子元素,避免全局匹配导致的重复内容 - 新增的空模板直接拦截输入中不需要的原生
<li>,不让它们通过默认模板输出 - 调整
content-item-name的路径为.//,只在当前ol节点下查找,匹配更精准
内容的提问来源于stack exchange,提问作者pantherfan
相关产品推荐
相关产品推荐

