我需要根据id属性的值删除子元素。如果在id属性中没有值,或者在contentblock标签中根本没有id属性,那么只需删除元素,父元素将保持不变,如果存在。此外,如果内容块是根元素的直接子元素,并且该内容块在id属性中没有值或没有id属性,则也删除该元素。
的例子:
<root>
<div>
<contentblock class="align-center" id="" />
</div>
<p>
<contentblock class="align-center" />
</p>
<h2>
<contentblock class="align-center" id="623a7a1f87dd1975ce084ac7"/>
</h2>
<contentblock class="align-center" id=""/>
<contentblock class="align-center" id="623a7a1f87dd1975ce084ac7"/>
<contentblock class="align-center"/>
</root>
预期结果:
<root>
<div>
</div>
<p>
</p>
<h2>
<contentblock class="align-center" id="623a7a1f87dd1975ce084ac7"/>
</h2>
<contentblock class="align-center" id="623a7a1f87dd1975ce084ac7"/>
</root>
提前感谢您的帮助。
我尝试了,但没有给出预期的结果:
<!--<xsl:template match="contentblock[not(parent::root)] | contentblock[(parent::root)]">-->
<!--<xsl:choose>-->
<!-- <xsl:if test="contentblock/@id[string-length(.) =0]">-->
<!-- <xsl:apply-templates/>-->
<!-- </xsl:if>-->
<!--</xsl:choose>-->
<!--</xsl:template>-->
另一个尝试:
<xsl:template match="div[contentblock] | p[descendant::contentblock] | h2[descendant::contentblock] | h3[descendant::contentblock]">
<xsl:choose>
<xsl:when test="contentblock[@id!='']">
<xsl:apply-templates/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="contentblock[@id=''] | contentblock[not(@id)]">
<xsl:copy> <xsl:apply-templates select="@*"/></xsl:copy>
</xsl:when>
</xsl:choose>
</xsl:template>
我不能匹配<xsl:template match="contentblock[not(parent::root)]">
,因为它在内容块元素本身上执行转换,这给了我不同的结果。当我得到这样的xml时,上面的解决方案也不起作用。当contentblock有多层父元素时,比如这里p和span是contentblock的父元素
<p id="5c3692c8af8fe1f061518abc">
<span bulb-font-face="museo-sans, sans-serif">
<contentblock class="align-center block-full-width" id="5c3686fdcb7de304cd51696f" />
</span>
</p>
这个模板将匹配具有某些值的id
属性的contentblock
元素:
<xsl:template match="contentblock[@id!='']"/>
您必须将此模板应用于所有相关的contentblock
元素,并且在模板中您必须返回您想要返回的任何内容,例如
<xsl:copy-of select="."/>