我想选择所有后代但“博客”节点。例如,只有子树应出现在输出上。 我正在尝试这个xsl代码:
<xsl:template match="rdf:RDF">
<xsl:copy>
<xsl:copy-of select="descendant::*[not(descendant::blog)]"/>
</xsl:copy>
</xsl:template>
这个xml:
<rdf:RDF>
<profesor rdf:ID="profesor_39">
<nombre rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
>Augusto</nombre>
</profesor>
<blog rdf:ID="blog_41">
<entradas>
<entrada_blog rdf:ID="entrada_blog_42">
<etiquetas>
<tecnologia rdf:ID="tecnologia_49">
<termino rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
>Atom</termino>
</tecnologia>
</etiquetas>
<autor>
<alumno rdf:ID="alumno_38">
<nombre rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
>Jesus</nombre>
</alumno>
</autor>
</entrada_blog>
</entradas>
<autores rdf:resource="#alumno_38"/>
<direccion rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
>http://tfg1.unex.es/10comunidad/wordpress/</direccion>
</blog>
</rdf:RDF>
我错过了什么? “博客”节点仍然打印在输出上。 谢谢。
答案 0 :(得分:5)
这是一个完整的解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- By default, recursively copy all nodes unchanged -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- But strip out <blog> -->
<xsl:template match="blog"/>
<!-- If you want to strip out just the <blog> start and end tags, use this instead:
<xsl:template match="blog">
<xsl:apply-templates/>
</xsl:template>
-->
</xsl:stylesheet>
答案 1 :(得分:1)
省略博客及其所有子女:
<xsl:template match="RDF">
<xsl:copy-of select="child::node()[name() != 'blog']"/>
</xsl:template>
要省略博客但仍然是其子女:
<xsl:template match="RDF">
<xsl:copy-of select="descendant::node()[name() != 'blog']"/>
</xsl:template>
答案 2 :(得分:0)
条件not(descendant :: blog)排除任何具有名为“blog”的后代的节点。
所以如果你有:
<blog id="1">
<test id="1.1">
<blog id="1.1.1" />
</test>
</blog>
<blog id="2">
<test id="2.1" />
</blog>
它将排除&lt; blog id =“1”&gt;和&lt; test id =“1.1”&gt ;,因为这些节点都具有&lt; blog id =“1.1.1”&gt;作为后代。
但它不排除&lt; blog id =“1.1.1”&gt;或&lt; blog id =“2”&gt;因为他们没有任何名为“博客”的后代
另请注意,您选择的后代:: * [not(descendant :: blog)]将输出&lt; test id =“2.1”&gt;两次:一次在&lt; blog id =“2”&gt;内,再一次在其中。
对于一个完整的解决方案,Evan Lenz建议的那个(用“博客”节点的空白覆盖模板进行身份转换)可能是给出你想要的结果的那个。