2016-08-16 2 views
0

С помощью этого источника XML:Почему <xsl: template match = "/"> выдает ошибку при добавлении <xsl: result-document>?

<?xml version='1.0' encoding='UTF-8'?> 
<ns:Report_Data xmlns:ns="urn:someURN"> 
    <ns:Report_Entry> 
     <ns:ReportName>SomeReportName</ns:ReportName> 
     <ns:ReportComments>Some description for this report....</ns:ReportComments> 
     <ns:AreaWhereUsed Descriptor="ThisIsATransform"> 
      <ns:ID type="GUID">SomeUniqueID</ns:ID> 
      <ns:ID type="Component_ID">CUSTOM_COMPONENT</ns:ID> 
     </ns:AreaWhereUsed> 
     <ns:AreaWhereUsed Descriptor="SomeProcessName"> 
      <ns:ID type="GUID">SomeDifferentUniqueID</ns:ID> 
      <ns:ID type="Process_ID">SomeProcessName</ns:ID> 
     </ns:AreaWhereUsed> 
     <ns:Area_Where_Used/> 
     <ns:Area_Where_Used> 
      <ns:AWU_Comment>This is some process description</ns:AWU_Comment> 
     </ns:Area_Where_Used> 
     <ns:CFs> 
      <ns:CF>SomeCF</ns:CF> 
     </ns:CFs> 
    </ns:Report_Entry> 
</ns:Report_Data> 

Я пытаюсь преобразовать его в набор текстовых документов. Один документ для каждой «записи отчета».

Когда я использую этот XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns="urn:someURN" 
    exclude-result-prefixes="xs" version="2.0"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="delimiter" select="'&#x09;'"/> 
    <xsl:variable name="quote" select="'&#x22;'"/> 
    <xsl:variable name="linefeed" select="'&#xA;'"/> 
    <xsl:template match="/"> 
     <!-- Data Row Begins --> 
     <xsl:for-each select="/ns:Report_Data/ns:Report_Entry"> 

       <xsl:text>Text and various other stuffs</xsl:text> 

     </xsl:for-each> 
     <!-- Data Row End --> 
    </xsl:template> 
</xsl:stylesheet> 

Выход является то, что одна строка текста, который я в основном ожидать.

Однако, когда я добавить result-document тег, например:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns="urn:someURN" 
    exclude-result-prefixes="xs" version="2.0"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="delimiter" select="'&#x09;'"/> 
    <xsl:variable name="quote" select="'&#x22;'"/> 
    <xsl:variable name="linefeed" select="'&#xA;'"/> 
    <xsl:template match="/"> 
     <!-- Data Row Begins --> 
     <xsl:for-each select="/ns:Report_Data/ns:Report_Entry"> 
      <xsl:result-document method="text" href="file_{@ns:ReportName}-output.txt"> 
       <xsl:text>Text and various other stuffs</xsl:text> 
      </xsl:result-document> 
     </xsl:for-each> 
     <!-- Data Row End --> 
    </xsl:template> 
</xsl:stylesheet> 

Я получаю ошибку: Error: Internal error evaluating template rule at line 10 in module, который ссылается на шаблон строки: <xsl:template match="/"> Я использую сайт http://xslttest.appspot.com/ для тестирования моего преобразования.

Я все еще довольно новичок в XSL, поэтому я не совсем понимаю, что делают теги шаблона и шаблона приложения. Я был бы признателен за любые указания относительно того, как тег шаблона взаимодействует с тегом результата-документа.

(Обратите внимание, что я сильно дезинфицировал код, но он работает, как указано выше).

Спасибо!

+0

Итак, вы используете онлайн-приложение, в котором вы хотите записать файл с помощью 'xsl: result-document'? Где вы ожидаете, что файл будет записан? Я бы предложил протестировать в среде (например, в вашей собственной системе с установленным XSLT-процессором или установленной XML-IDE), где вы можете быть уверены, что ваш процессор имеет право получить доступ к файловой системе для записи результатов. –

+0

Извините, я должен добавить, что я также пробовал это в целевой среде (о которой я сказал, что поставщик поддерживает эту функцию), и он также произвел аналогичную неопределенную ошибку. – Matt

+0

Если выходной формат должен быть простым текстом, мне интересно, почему у вас есть 'href =" файл _ {@ ReportName} -output.xml "' с '.xml'. Я также задаюсь вопросом, почему у вас есть '@ ReportName', я думаю, что вы хотите' ReportName' вместо этого, поскольку у вас есть только элемент этого имени, а не атрибут этого имени. –

ответ

0

Прежде всего, префикс пространства имен не используется в xpath в <xsl:for-each select="/Report_Data/Report_Entry">, но ваш входной файл xml имеет его. Поэтому я сомневаюсь, что из вашей трансформации будет выход.
Вы можете указать префикс для пространства имен, urn:(someURN) и использовать тот же префикс с элементами в xpath.
например, xmlns:ns="urn:(someURN)"
<xsl:for-each select="/ns:Report_Data/ns:Report_Entry">

Использование веб-сайта (внешний ресурс) может быть проблемой при использовании xsl:result-document, как эта команда будет инструктировать процессору писать локальный файл, который не может быть возможным.
Я предлагаю вам использовать локальный процессор и попробовать преобразование.

+0

Отсутствующее пространство имен - всего лишь артефакт санитарии. Он работает правильно без результирующего документа. Я ожидал, что веб-сайт просто представит файл как текст, например, он имеет другой вывод, но я полагаю, что это может быть проблемой. К сожалению, я уже пробовал это в целевой системе, а также генерировал некоторую аналогичную общую ошибку. Мне сказали, что целевая система поддерживает эту функциональность в XSL 2.0, поэтому я склонен полагать, что проблема связана с внедряющей системой, установленной между клавиатурой и стулом. – Matt

0

Сообщение

Error: Internal error evaluating template rule

часто указывает на внутреннюю ошибку в пределах Saxon, что должно быть сообщено Saxonica. Однако возможно, что это может быть вызвано методом «обратного вызова», таким как OutputURIResolver. Например, люди, реализующие эту онлайн-службу, будут использовать OutputURIResolver, который безошибочно исключает исключение при вызове xsl: result-document (хотя есть более чистые способы настройки Saxon для достижения такого же эффекта).

Так что я предлагаю, сообщать об этом Саксонике только в том случае, если вы можете воспроизвести его в своей собственной среде, где вы точно знаете, как настроен Саксон.

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