2016-01-26 2 views
1

Я хочу сравнить атрибуты двух xml-файлов и идентификатора, преобразуя входной файл в тот же шаг. Выходной файл xml должен содержать только элементы, атрибуты которых присутствуют при сравнении xml. Как показано в данном примере, последняя концепция узел не должен быть выведен, так как нет атрибута соответствия в comparing.xmlПреобразование идентичности - сравнение атрибутов и выход предельных значений

Input.xml

<navigation 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<facets> 
    <facet id="d1e12000000000000000000000011111"> 
     <title xml:lang="en">sometxt</title> 
     <title xml:lang="de">eintxt</title> 
     <concepts> 
      <concept id="d1e12000000000000000000000000000"> 
       <title xml:lang="en">sometxt</title> 
       <title xml:lang="de">eintxt</title> 
       <concepts> 
        <concept id="d1e19000000000000000000000000000"> 
         <title xml:lang="en">sometxt</title> 
         <title xml:lang="de">eintxt</title> 
         <concepts> 
         </concepts> 
        </concept> 
       </concepts> 
      </concept> 
     </concepts> 
    </facet> 
</facets> 

часть comparing.xml с неопределенным заголовком-уровней

<foo> 
<heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">Myheading</heading> 
<chapter> 
    <heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">myheading</heading> 
    <operation> 
     <heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">another heading</heading> 
    </operation> 
</chapter> 

желательно output.xml с

<nav:navigation 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:nav="http://www.nav.de/"> 
<nav:facets> 
    <nav:facet id="d1e12000000000000000000000011111"> 
     <nav:title xml:lang="en">sometxt</nav:title> 
     <nav:title xml:lang="de">eintxt</nav:title> 
     <nav:concepts> 
      <nav:concept id="d1e12000000000000000000000000000"> 
       <nav:title xml:lang="en">sometxt</nav:title> 
       <nav:title xml:lang="de">eintxt</nav:title> 
       <nav:concepts> 
       </nav:concepts> 
      </nav:concept> 
     </nav:concepts> 
    </nav:facet> 
</nav:facets> 

мой XSL применимо только идентификаторам до сих пор

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:nav="http://www.nav.de/" 
    version="2.0" > 
     <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
     <xsl:variable name="docu" select="document(comparing.xml)"/> 

     <xsl:template match="*"> 
      <xsl:element name="nav:{name()}" namespace="http://www.nav.de/"> 
       <xsl:copy-of select="namespace::*"/> 
       <xsl:apply-templates select="node()|@*"/> 
      </xsl:element> 
     </xsl:template> 

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

EDIT: извините за размещение этого в замечании сечении. Я пытался что-то вдоль этих линий, но это не сработало

<xsl:template match="concept | facet"> 
     <xsl:variable name="foo-id" select="@id"/> 
     <xsl:for-each select="$docu//heading"> 
      <xsl:if test="contains(./@class, $foo-id)"> 
       <xsl:apply-templates/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
+1

** 1. * * У вас есть контроль над форматом 'compareing.xml'? Использование "|" ограниченный список является ненужным осложнением. Если вы используете XML, используйте его правильно и поместите каждое значение в отдельный узел. - ** 2. ** Предполагаете ли вы сравнивать данное значение 'id' с ** любым **' class' - независимо от родителя или уровня? –

+0

** 1. ** К сожалению, у меня нет контроля над форматом, извините. ** 2. ** точно! например: Если 'class' содержит' id', тогда выведите '' или '' элементы; если нет, то не выводите их – DTR9000

ответ

1

Я хотел бы предложить вам попробовать это так:

XSLT 2.0

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

<xsl:param name="comparing-url" select="'comparing.xml'"/> 

<xsl:key name="comp" match="@class" use="tokenize(., '\|')" /> 

<xsl:template match="*"> 
    <xsl:element name="nav:{name()}" > 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="*[@id][not(key('comp', @id, document($comparing-url)))]"/> 

</xsl:stylesheet> 
+0

Спасибо за ваше предложение! Я получаю сообщение об ошибке 'SXLM0001: Слишком много вложенных вызовов шаблонов приложений. Таблица стилей может быть циклической. ' – DTR9000

+0

@ TR9000 Это работает для меня здесь, используя Saxon 8.9. Какой процессор XSLT вы используете? –

+0

mhh Я использую saxon9he – DTR9000

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