2015-11-27 2 views
1

я следующий XML-файлдобавлять и удалять дочерний элемент с помощью XSLT

<rules> 
    <rule> 
    <name>aa</name> 
    </rule> 

    <rule> 
    <name>cc</name> 
    </rule> 

    <rule> 
    <name>bb</name> 
    </rule> 

</rules> 

Я хотел бы удалить существующие 3 правила и вместо того, чтобы добавить новое правило

<rule> 
    <name>zz</name> 
    </rule> 

поэтому выход должен быть

<rules> 
    <rule> 
     <name>zz</name> 
    </rule> 
</rules> 

Я пробовал это xslt,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 


    <xsl:template match="rule[name[text()='aa']]"/> 
    <xsl:template match="rule[name[text()='bb']]"/> 

    <xsl:template match="rule[name[text()='cc']]"/> 


    <xsl:template match="rule[position()=last()]"> 
     <xsl:copy-of select="."/> 
     <rule> 
      <name>zz</name> 
     </rule> 
    </xsl:template> 


</xsl:stylesheet> 

но производят это - (см не удаляется)

<rules> 
    <rule> 
     <name>cc</name> 
    </rule> 
    <rule> 
     <name>zz</name> 
    </rule> 

</rules> 

В чем проблема с XSLT?

+1

Удалите '' Из вашего шаблона – har07

ответ

0

Поскольку XSL функционирует, все операции, которые вы определяете, происходят в исходном документе. Это не похоже на то, что вы удаляете одно правило, а затем другое и т. Д., Вы просто определяете функцию, которая будет применяться к исходному документу. Ваш последний шаблон преобразует согласованный узел в тот же узел (операция копирования) плюс новый элемент.

1

Если вы хотите заменить все элементы rule под rules, это может быть проще просто иметь шаблон, соответствующий rules вместо, где выход нового правила, и больше ничего не выбирать.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="rules"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/>    
      <rule> 
       <name>zz</name> 
      </rule> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

В качестве альтернативы, если у вас есть другие rule элементы, которые вы хотите сохранить, другие aa, bb и cc из них, то вы можете добавить xsl:apply-templates к rules шаблонов, и ваши другие шаблоны соответствия игнорировать их

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

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

    <xsl:template match="rule[name='aa']"/> 
    <xsl:template match="rule[name='bb']"/> 
    <xsl:template match="rule[name='cc']"/> 
</xsl:stylesheet>