2014-12-22 5 views
-1

Я пытаюсь объединить 2 xml документа, беря некоторые значения атрибутов в первом и вводя их в другой.XSLT недоразумение document() function

Мой первый XML: Manual.xml имеет такой вид: У меня есть что-то вроде 5 000 задач, как следующие:

  <task chapnbr="05" 
       sectnbr="11" 
       subjnbr="04" 
       pgblknbr="08" 
       breaknbr="001" 
       confnbr="" 
       confgtxt="" 
       func="200" 
       seq="001" 
       confltr="" 
       chg="u" 
       key="t051104200001" 
       revdate="20070615"> 
       <effect effrg="ALL"> 

Второй XML я обращаться: Dictionary.xml:

<dictionary engine="CFM56" version="3" manual="ESM"> 
    <task oldkey="T050000870001" 
     newkey="TKESM050000870001" 
     chapnbr="05" 
     sectnbr="00" 
     subjnbr="00" 
     func="870" 
     seq="001"> 
     <title>GENERAL - INTRODUCTION</title> 
    </task> 
    <task oldkey="T051100200001" 
     newkey="TKESM051100200001" 
     chapnbr="05" 
     sectnbr="11" 
     subjnbr="00" 
     func="200" 
     seq="001"> 
     <title>LIFE LIMITS OF ENGINE ROTATING PARTS</title> 
    </task> 
    <task oldkey="T051101200001" 
     newkey="TKESM051101200001" 
     chapnbr="05" 
     sectnbr="11" 
     subjnbr="01" 
     func="200" 
     seq="001"> 
     <title>FAN ROTOR - LIFE LIMITS</title> 
    </task> 
    <task oldkey="T051102200001" 
     newkey="TKESM051102200001" 
     chapnbr="05" 
     sectnbr="11" 
     subjnbr="02" 
     func="200" 
     seq="001"> 
     <title>HIGH PRESSURE COMPRESSOR ROTOR - LIFE LIMITS</title> 
</dictionary> 

Мне нужно принять значение атрибута «seq» в словаре и заменить его в Руководстве, если атрибут «старый ключ» в Словаре равен атрибуту «ключ» в Руководстве.

Для этого я написал эту XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 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:fn="http://www.w3.org/2005/xpath-functions"> 

<xsl:output 
    encoding="UTF-8" 
    method="xml" 
    indent="yes" 
    omit-xml-declaration="yes" 
    cdata-section-elements="comments"/> 


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

<xsl:template match="@seq[parent::task]"> 
    <xsl:variable name="oldkey" select="upper-case(../@key)"/> 
    <xsl:attribute name="seq"> 
     <xsl:value-of select="document('./Dictionary.xml')/dictionary/task[@oldkey=$oldkey]/@seq"/> 
    </xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 

Но результат я получить то, что все значения «SEQ» изменены и заменены пробелом в Руководстве. Вот пример вывода:

<task chapnbr="72" 
       sectnbr="00" 
       subjnbr="00" 
       pgblknbr="01" 
       breaknbr="011" 
       confnbr="" 
       confgtxt="" 
       func="810" 
       seq="" 
       confltr="" 
       chg="u" 
       key="t720000810011" 
       revdate="19981015"> 

Я думаю, что моя проблема исходит из того, как я использовать функцию документа(), но я попробовал много вещей, и ничего не меняется. Результат остается неизменным, мне не удается получить другое значение, кроме пробела в атрибуте «seq» моего выходного файла Manual.

Мне нужно получить выход, где значение атрибута «seq» составлено из 3 целых чисел и считано из Dictionnary. Что-то нравится, что:

<task chapnbr="72" 
       sectnbr="00" 
       subjnbr="00" 
       pgblknbr="01" 
       breaknbr="011" 
       confnbr="" 
       confgtxt="" 
       func="810" 
       seq="001" 
       confltr="" 
       chg="u" 
       key="t720000810011" 
       revdate="19981015"> 

Чтобы быть более точным о моем ввода/outuput файла (Manual.xml). Полный файл следующего вида:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE EM [<!ENTITY g1105335-00 SYSTEM " file://D:/Indigo_AP/Load_CFM56-3/5- Inputs/../Arts/1105335-00.tif" NDATA ccitt4> 
<!ENTITY g1105336-00 SYSTEM " file://D:/Indigo_AP/Load_CFM56-3/5-Inputs/../Arts/1105336-00.tif" NDATA ccitt4 > 

<!-- A lot of Doctype declaration --> 

<em spl="062W0" 
model="CFM56-3" 
oidate="19831231" 
tsn="71" 
docnbr="CFMI-TP_SM_5" 
lang="english" 
revdate="20131215" 
chg="u"> 
    <title>CFM56-3 Engine Manual</title> 

    <!-- Many child elements --> 

    <chapter chapnbr="05" chg="u" key="c05" revdate="20121215"> 
     <title>TIME LIMITS AND MAINTENANCE CHECKS</title> 

     <section chapnbr="05" 
      sectnbr="00" 
      chg="u" 
      key="cs0500" 
      revdate="20121215"> 
     <title>GENERAL</title> 

     <subject chapnbr="05" 
       sectnbr="00" 
       subjnbr="00" 
       chg="u" 
       key="css050000" 
       revdate="20121215"> 
      <title>GENERAL - INTRODUCTION</title> 

      <pgblk chapnbr="05" 
       sectnbr="00" 
       subjnbr="00" 
       pgblknbr="00" 
       breaknbr="001" 
       chg="u" 
       key="p05000000001000" 
       revdate="20121215"> 
       <title>GENERAL - INTRODUCTION</title> 

       <task chapnbr="05" 
       sectnbr="00" 
       subjnbr="00" 
       pgblknbr="00" 
       breaknbr="001" 
       confnbr="" 
       confgtxt="" 
       func="870" 
       seq="001" 
       confltr="" 
       chg="u" 
       key="t050000870001" 
       revdate="20121215"> 
        <effect effrg="ALL"></effect> 
        <title>GENERAL - INTRODUCTION</title> 

        <!-- Many child elements --> 

      </task> 
     </pgblk> 
    </subject> 
    </section> 

    <section chapnbr="05" 
      sectnbr="11" 
      chg="u" 
      key="cs0511" 
      revdate="20121215"> 
    <title>LIFE LIMITS</title> 

    <subject chapnbr="05" 
       sectnbr="11" 
       subjnbr="00" 
       chg="u" 
       key="css051100" 
       revdate="20070615"> 
     <title>LIFE LIMITS</title> 

     <pgblk chapnbr="05" 
       sectnbr="11" 
       subjnbr="00" 
       pgblknbr="08" 
       breaknbr="001" 
       chg="u" 
       key="p05110008001000" 
       revdate="20070615"> 
      <title>LIFE LIMITS OF ENGINE ROTATING PARTS</title> 

      <task chapnbr="05" 
       sectnbr="11" 
       subjnbr="00" 
       pgblknbr="08" 
       breaknbr="001" 
       confnbr="" 
       confgtxt="" 
       func="200" 
       seq="001" 
       confltr="" 
       chg="u" 
       key="t051100200001" 
       revdate="20070615"> 
       <effect effrg="ALL"></effect> 
       <title>LIFE LIMITS OF ENGINE ROTATING PARTS</title> 

       <!-- Many child elements --> 

      </task> 
     </pgblk> 
    </subject> 

    <subject chapnbr="05" 
       sectnbr="11" 
       subjnbr="01" 
       chg="u" 
       key="css051101" 
       revdate="20070615"> 
     <title>FAN ROTOR - LIFE LIMITS</title> 

     <pgblk chapnbr="05" 
       sectnbr="11" 
       subjnbr="01" 
       pgblknbr="08" 
       breaknbr="001" 
       chg="u" 
       key="p05110108001000" 
       revdate="20070615"> 
      <title>FAN ROTOR - LIFE LIMITS</title> 

      <task chapnbr="05" 
       sectnbr="11" 
       subjnbr="01" 
       pgblknbr="08" 
       breaknbr="001" 
       confnbr="" 
       confgtxt="" 
       func="200" 
       seq="001" 
       confltr="" 
       chg="u" 
       key="t051101200001" 
       revdate="20070615"> 
       <effect effrg="ALL"></effect> 
       <title>FAN ROTOR - LIFE LIMITS</title> 

       <!-- Many child elements --> 

       </task> 
      </pgblk> 
     </subject> 
     </section> 
    </chapter> 
</em> 
+2

Пожалуйста, пост минимален, но ** полные ** примеры вашего ввода и ожидаемого результата. В настоящее время оба ваших входных документа не являются хорошо сформированным XML. –

+0

Мои входы и выходы состоят из более чем двух миллионов строк, поэтому я разместил только образцы. – Charpi

+3

Образцы в порядке, но они должны быть хорошо сформированы. –

ответ

0

Я предлагаю вам выполнить следующую таблицу стилей (от любого хорошо сформированным ввода XML) и посмотреть, что вы получите:

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

<xsl:variable name="dict" select="document('Dictionary.xml')" /> 
<xsl:variable name="key" select="'T050000870001'" /> 

<xsl:template match="/"> 
    <results> 
     <dictionary-exists> 
      <xsl:value-of select="boolean($dict)"/> 
     </dictionary-exists> 
     <entry-exists> 
      <xsl:value-of select="boolean($dict/dictionary/task[@oldkey=$key])"/> 
     </entry-exists> 
     <value> 
      <xsl:value-of select="$dict/dictionary/task[@oldkey=$key]/@seq"/> 
     </value> 
    </results> 
</xsl:template> 

</xsl:stylesheet> 
+0

Я получаю этот вывод: ' <словарь-существует> false false 'Проблема в том, что процессор xsl не может найти файл словаря, но я дважды проверял, а файл словаря находится в том же каталоге, что и мой xsl-файл – Charpi

+0

Ну, по крайней мере, вы знаете, где проблема сейчас. Возможно, проверьте имя файла для ведущих/конечных пробелов и других аномалий. –

+0

Я снова проверил имя файла, но ничего не кажется неправильным. Я нашел это discusion на sourceforge: [ссылка здесь] (http://sourceforge.net/p/saxon/mailman/saxon-help/thread/[email protected]/). И я использую преобразователь саксона. Может быть, моя проблема связана с тем, как мой трансформатор обрабатывает файл xsl. – Charpi

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