Как удалить элементы XML динамически - PullRequest
2 голосов
/ 20 сентября 2011

Я в основном ищу XSLT (скажем, вызываемый шаблон), который будет принимать в качестве входных данных xml И элемент, который будет удален в XML, и возвращает мне окончательный XML после удаления этого конкретного элемента в XML.

Пример:

<Request>
  <Activity1>XYZ</Activity1>
  <Activity2>ABC</Activity2>
</Request>

Теперь мне нужен xslt, для которого я должен предоставить вышеупомянутый xml в качестве ввода и удаляемый элемент (скажем, <Activity1>) в качестве ввода.XSLT должен вернуть окончательный xml после удаления переданного ему элемента.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Вы можете использовать модифицированный шаблон копирования:

<xsl:stylesheet ...>
   <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

   <xsl:variable name="removeNode">Activity1</xsl:variable>

   <xsl:template match="node()">        
     <xsl:if test="not(name()=$removeNode)">
       <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
     </xsl:if>
   </xsl:template>

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

Способ передачи параметра в шаблон зависит от используемого вами XSLT-процессора.

Редактировать

Другая возможность - игнорировать узел при необходимости:

<xsl:template match="/">
  <xsl:apply-templates select="*/*[not(self::element-to-ignore)]" 
                       mode="renderResult"/>
</xsl:template>

<xsl:template match="@*|node()" mode="renderResult">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" mode="renderResult"/>
  </xsl:copy>
</xsl:template>
0 голосов
/ 20 сентября 2011

Это общее преобразование, которое принимает глобальный (заданный извне) параметр с именем удаляемого элемента:

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

 <xsl:param name="pDeleteName" select="'c'"/>

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

 <xsl:template match="*">
  <xsl:if test="not(name() = $pDeleteName)">
   <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

при применении к любому документу XML (например, к следующему):

<a>
 <b>
   <c/>
   <d>
     <e>
       <c>
         <f/>
       </c>
       <g/>
     </e>
   </d>
 </b>
</a>

получен правильный результат - исходный XML-документ, в котором любой элемент, имя которого совпадает со строкой в ​​параметре pDeleteName, удаляется :

<a>
   <b>
      <d>
         <e>
            <g/>
         </e>
      </d>
   </b>
</a>

Как ясно видно, любое вхождение элемента <c> было удалено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...