根据子元素xslt 1的某些属性标准删除子元素



我需要根据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="."/>

最新更新