2013-03-20 6 views
1

Я хочу совместить все узлы в моем xml, кроме одного, то есть docbody. Что-то вродеxslt соответствует всем узлам, кроме определенного

<xsl:template match="@*|node()[not(docBody)]" name="identity"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"> 
</xsl:copy> 
</xsl:template> 

Как достичь этого, я пробовал путь выше.

+0

В чем вопрос? – kamituel

+0

Я попытался исключить узел таким образом, он не работает, есть способ исключить узел в соответствие – luckyluke

ответ

3

Match все, но это одно (добавление self::) и перезаписать шаблон по умолчанию для docBody (без него содержимое docBody бы все еще печатаются):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 

<xsl:template match="@*|node()[not(self::docBody)]" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- overwrite the default template --> 
<xsl:template match="docBody"> 
</xsl:template> 

</xsl:stylesheet> 
+0

Чтобы исключить комментарии, будет ли XPath быть '@ * | node() [not (self :: comment())] 'или' @ * | node() [not (// comment())] 'соответственно? – CoDEmanX

0

Да, вам просто нужно сделать, это:

<xsl:template match="@*|node()[not(self::docBody)]" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"> 
    </xsl:copy> 
</xsl:template> 
4

Ваше состояние матч говорит «любой узел, который не имеет docBody элемент ребенка», которая отличается от не будучи docBody элемент сам. Вы хотите:

<xsl:template match="@*|node()[not(self::docBody)]" name="identity"> 

Хотя вы должны использовать только два шаблона:

<xsl:template match="docBody"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
+0

+1 для «Хотя вы должны просто использовать два шаблона» –

Смежные вопросы