2015-11-20 4 views
0

Хорошо, еще один вопрос XSLT. Это преобразование состоит из двух действий, которые я работаю индивидуально в двух разных XSLT, но которые я не могу использовать для меня.XSLT Identity Transformation при удалении всех атрибутов

Я пытаюсь создать преобразование идентичности, которое выбирает набор узлов, а также удаляет все атрибуты. Вот что я работаю с:

данных:

<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
    <meta> 
     <data> 
      <uselessMeta>SomeValue</uselessMeta> 
     </data> 
    </meta> 
    <dataWrapper> 
     <data xmlns:xfa="http://www.w3.org/1999/xhtml"> 
      <neededData1 meanAttribute="NotWanted">TransformMe!</neededData1> 
      <neededData2 meanAttribute="NotWanted">TransformMe!</neededData2> 
     </data> 
    </dataWrapper> 
</doc> 

XSLT 1 (тождественное преобразование):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0" > 
    <xsl:output omit-xml-declaration="no" method="xml" indent="no"/> 
    <xsl:template match="/"> 
     <xsl:copy> 
      <xsl:copy-of select="//dataWrapper/data[text() != '']" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

XSLT 2: XSLT - remove all attributes

Wanted Результат:

<?xml version="1.0" encoding="UTF-8"?> 
<data xmlns:xfa="http://www.w3.org/1999/xhtml"> 
     <neededData1>TransformMe!</neededData1> 
    <neededData2>TransformMe!</neededData2> 
</data> 

Проблема заключается в том, что я пытаюсь сопоставить либо корень (/), либо все узлы (node()), но я не могу использовать <xsl:copy-of /> и <xsl:apply-templates /> вместе. Вещи, чтобы отметить:

  • Xalan (JDK 1.7)
  • XSLT 1.0

Любая помощь очень ценится!

ответ

1

Вместо использования xsl:copy-of в вашем первом XSLT вы можете выбрать xsl:apply-templates, который затем может выбрать шаблоны в вашем втором XSLT (один раз в сочетании с первым). xsl:copy-of просто копирует существующий узел без внесения каких-либо изменений или применения каких-либо других шаблонов.

Попробуйте XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > 
    <xsl:output omit-xml-declaration="no" method="xml" indent="no"/> 

    <xsl:template match="/"> 
     <xsl:copy> 
      <a> 
       <xsl:apply-templates select="//dataWrapper/data[text() != '']" /> 
      </a> 
     </xsl:copy> 
    </xsl:template> 

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

    <xsl:template match="@*"/> 
</xsl:transform> 

Обратите внимание, что я должен удалить матч на @* из шаблона идентичности, поэтому он просто соответствует node(). Наличие двух шаблонов, которые совпадают с одним и тем же приоритетом, могут быть подняты как ошибки некоторыми процессорами, хотя они также могут выбрать последний подходящий шаблон. (См. http://www.w3.org/TR/xslt#conflict)

+0

Большое спасибо, сэр! Я был настолько сосредоточен на единственном совпадении с шаблонами, которое несколько раз не приходило мне в голову. Это также безупречно работало в Xalan. Спасибо! – GuillaumeC91

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