2016-06-23 3 views
0

Я новичок в XSLT и не знаю, как решить случай, когда я хотел бы удалить некоторые узлы, ссылающиеся на другие, в зависимости от позиции ссылочных элементов в коде.Удалить ссылочный элемент итеративно

Вот краткий и простой пример (синтаксис может быть не точным). Источник:

<nodeTypeA id=0> 
    <nodeTypeB id="1">lorem ipsum</nodeTypeB> 
    <nodeTypeC id="2"> 
    <nodeTypeD id="3">D1</nodeTypeD> 
    <nodeTypeE id="4">D2</nodeTypeE> 
    <nodeTypeF id="5">D2</nodeTypeF> 
    </nodeTypeC> 
    <nodeTypeC id="6"> 
    <nodeTypeD id="7">D1</nodeTypeD> 
    <nodeTypeE id="8">D2</nodeTypeE> 
    <nodeTypeF id="9">D2</nodeTypeF> 
    </nodeTypeC> 
</nodeTypeA> 
<nodeType1 id="a"> 
    <nodeType2 id="b" ref="5">lorem ipsum</nodeType2> 
    <nodeType3 id="c" ref="2">lorem ipsum</nodeType3> 
    <nodeType4 id="d" ref="1">lorem ipsum</nodeType4> 
    <nodeType5 id="e" ref="3">lorem ipsum</nodeType5> 
    <nodeType6 id="f" ref="4">lorem ipsum</nodeType6> 
    <nodeType2 id="g" ref="6">lorem ipsum</nodeType2> 
    <nodeType3 id="h" ref="7">lorem ipsum</nodeType3> 
    <nodeType5 id="i" ref="8">lorem ipsum</nodeType5> 
    <nodeType6 id="j" ref="9">lorem ipsum</nodeType6>   
</nodeType1> 

Моя цель состоит в том, чтобы удалить все детям узлов nodeTypeC (то есть те, с идентификаторами 2 & 6), а также узлами под nodeType1, которые относятся к тем удаленным детям (то есть IDS 3, 4, 5, 7, 8, 9). Поэтому я хотел бы удалить узлы с идентификаторами e, f, b, h, i, j. В результате частичного XML будет следующим:

<nodeTypeA id=0> 
    <nodeTypeB id="1">lorem ipsum</nodeTypeB> 
    <nodeTypeC id="2"></nodeTypeC> 
    <nodeTypeC id="6"></nodeTypeC> 
</nodeTypeA> 
<nodeType1 id="a"> 
    <nodeType3 id="c" ref="2">lorem ipsum</nodeType3> 
    <nodeType4 id="d" ref="1">lorem ipsum</nodeType4> 
    <nodeType2 id="g" ref="6">lorem ipsum</nodeType2>   
</nodeType1> 

Я новичок в XSLT, так что ответ может показаться тривиальным для вас ... Спасибо за вашу помощь!

+0

Вы говорите, что «* удалить все ребенок из nodeTypeC узлов *» - но, видимо, вы также хотите удалить 'nodeTypeC' узлы самих себя? –

ответ

0

Определить ключ

<xsl:key name="ref" match="nodeTypeC/*" use="@id"/> 

, а затем написать три шаблона, то первое тождественное преобразование

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

второй удаляет детей nodeTypeC

<xsl:template match="nodeTypeC/*"/> 

а третий ссылочные элементы

<xsl:template match="nodeType1/*[key('ref', @ref)]"/> 

Конечно, Вы можете объединить последние два шаблона к одному один

<xsl:template match="nodeTypeC/* | nodeType1/*[key('ref', @ref)]"/> 
+0

Спасибо за ответ, он определенно решает мой вопрос! – Quentin

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