2017-02-21 22 views
0

Мне нужно уметь удалить определенный родительский узел (и его дочерние элементы) в зависимости от атрибутов, содержащихся в дочернем элементе <version> этого абзаца. Поэтому в приведенном ниже примере мне нужен XSLT, чтобы найти экземпляр <version version="ABCD"> и удалить все из родительского элемента <para0>. Другими словами, я пытаюсь выполнить условную фильтрацию текста. Элементу, который должен соответствовать (и удалять), будет ВСЕГДА быть родителем <applic>, но не всегда может быть <para0>, как в примере, поэтому мне нужно как-то указать, что ему нужно сопоставить родительский элемент «apply», а не явным образом указываю para0.C# XSLT удалить родительский узел на основе атрибута childnode

Это должно быть яснее из примера. Мне нужно удалить все данные para0 с атрибутом версии ABCD.

Так это какой-то образец XML

<root> 
    <para0> 
    <applic> 
     <model> 
     <version version="ABCD"></version> 
     </model> 
    </applic> 
     <subpara1><title>First Title</title> 
      <para>Some text relating to ABCD configuration</para> 
     </subpara1> 
     <subpara1><title>Second Title</title> 
      <para>Some other text and stuff relating to ABCD configuration</para> 
     </subpara1> 
    </para0> 
    <para0> 
    <applic> 
     <model> 
     <version version="TRAINING"></version> 
     </model> 
    </applic> 
     <subpara1><title>First Title</title> 
      <para>Some text relating to TRAINING configuration</para> 
     </subpara1> 
     <subpara1><title>Second Title</title> 
      <para>Some other text and stuff relating to TRAINING configuration</para> 
     </subpara1> 
    </para0> 
</root> 

Вот это XSLT я до сих пор, но мне это нужно, когда соответствие с ABCD, в основном выбрать и удалить родительский «прилож» и все дочерние узлы.

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method = "xml" indent="yes"/> 
     <xsl:strip-space elements = "*" /> 

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

     <xsl:template match = "//applic/model[@*]/version[@version='ABCD']" /> 

     </xsl:stylesheet> 
+0

Возможный дубликат [Как использовать "не" в XPath?] (Http://stackoverflow.com/questions/1550981/how-to -use-not-in-xpath) –

ответ

0

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

Try:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*[applic/model/version/@version='ABCD']" /> 

</xsl:stylesheet> 
+0

Спасибо, но это не всегда будет «para0», который я сопоставляю. Это может быть любое количество элементов, которые следует за тегом appik. Поэтому мне нужно удалить неизвестный элемент, а не «para0». –

+0

Хорошо, как насчет сейчас? –

+0

Большое спасибо. –