2016-08-03 1 views
0

У меня есть несколько файлов XML, которые состоят из атрибута отслеживания изменений <atict:add> или <atict:del>.Принять или отклонить отслеживание изменений в XML

Цель:

  • , если XML-файл состоит из элемента CT="ACCEPT" затем принять/печать все метки с <atict:add> и игнорировать <atict:del>
  • , если XML-файл consits одного элемента CT="REJECT" затем принимать/печати все теги с <atict:del> и игнорировать <atict:accept>

Пример XML:

<?xml version="1.0" encoding="UTF-8"?> 
<DM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:atict="http://www.arbortext.com/namespace/atict" **CT="ACCEPT"**> 
<PARA>abcd <atict:del>efghi</atict:del><atict:add>1456790 
</atict:add></PARA> 

<?xml version="1.0" encoding="UTF-8"?> 
<DM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:atict="http://www.arbortext.com/namespace/atict" **CT="ACCEPT"**> 
<PARA>abcd <atict:del>efghi</atict:del><atict:add>1456790 
</atict:add></PARA> 

Вывод XML после обработки:

<?xml version="1.0" encoding="UTF-8"?> 
<DM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:atict="http://www.arbortext.com/namespace/atict" **CT="ACCEPT"**> 
<PARA>abcd <atict:add>1456790 
</atict:add></PARA> 

<?xml version="1.0" encoding="UTF-8"?> 
<DM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:atict="http://www.arbortext.com/namespace/atict" **CT="ACCEPT"**> 
<PARA>abcd <atict:add>1456790 
</atict:add></PARA> 

Как я могу добавить CT в XSLT с, если условия, чтобы удовлетворить критериям?

+0

Два шаблона совпадения для '' add' и del'. С тестом на ':: ancestor @ CT =" ACCEPT/REJECT "' для дальнейшего согласования. –

+0

Спасибо, Joop, вот так?

+0

Да, хотя не совсем, я думал о совпадении 'add' not its 'text()' и, конечно, 'test =" :: ancestor [@ CT = 'ACCEPT'] "или такой, _lately не сделано XSLT_ - Кстати, в сети есть хорошие чит-листы на XSLT. –

ответ

0

Образец таблицы стилей ниже выполняет эту работу. См. Комментарии для объяснений.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:atict="http://www.arbortext.com/namespace/atict" 
    version="2.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

    <xsl:variable name="CT_stat"> 
     <xsl:choose> 
      <xsl:when test="DM/@CT = 'ACCEPT'">1</xsl:when> 
      <xsl:when test="DM/@CT = 'REJECT'">0</xsl:when> 
      <xsl:otherwise>2</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

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

    <!-- template matching for atict:del and atict:add, retaining 
      them or deleting them based on $CT_stat variable -->  
    <xsl:template match="atict:del"> 
     <xsl:choose> 
      <xsl:when test="$CT_stat=1"/> 
      <xsl:when test="$CT_stat=0"> 
       <xsl:copy-of select="."/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy-of select="."/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="atict:add"> 
     <xsl:choose> 
      <xsl:when test="$CT_stat=1"> 
       <xsl:copy-of select="."/> 
      </xsl:when> 
      <xsl:when test="$CT_stat=0"/> 
      <xsl:otherwise> 
       <xsl:copy-of select="."/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо за xsl Joel. Но вышеописанный xsl удаляет элемент и , а также значение, связанное с ним. Я думаю, что так или иначе он не обнаруживает CT = «ACCEPT» или «REJECT» и условие if. –

+0

Извините за вышеупомянутый комментарий Джоэл. Это работает с небольшим изменением! –

+0

Можно ли добавить третье условие к существующему XSL. если CT = '"", то принимайте как , так и ? –

1

Или просто:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:atict="http://www.arbortext.com/namespace/atict"> 
<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="atict:del[ancestor::DM/@CT='ACCEPT']"/> 
<xsl:template match="atict:add[ancestor::DM/@CT='REJECT']"/> 

</xsl:stylesheet> 
+0

Спасибо, Майкл. Но вышеописанный xsl удаляет элемент и , а также значение, связанное с ним. –

+0

Я думаю, что он не обнаруживает CT –

+0

"* выше xsl удаляет элемент и , а также значение, связанное с ним *« Разве это не то, что он должен делать? Если нет, отредактируйте свой вопрос и уточните. –