2016-08-16 1 views
0

:왜 <xsl : template match = "/"><xsl : result-document>를 추가 할 때 오류가 발생합니까? 이 소스 XML로

<?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 태그를 추가 Error: Internal error evaluating template rule at line 10 in module 템플릿 라인을 참조 : <xsl:template match="/">을 내 변환을 테스트하기 위해 웹 사이트 http://xslttest.appspot.com/을 사용하고

<?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> 

가 나는 오류가 발생합니다.

저는 아직 XSL에 익숙하지 않아 템플릿과 적용 템플릿 태그가하는 일을 이해하지 못합니다. 템플리트 태그가 result-document 태그와 상호 작용하는 방법에 관해서는 어떤 조언도 주시면 감사하겠습니다.

(코드를 심각하게 위생적으로 처리했지만 위와 같이 실행됩니다.)

감사합니다.

+0

그렇다면'xsl : result-document'를 사용하여 파일을 쓸 수있는 온라인 응용 프로그램을 사용하고 있습니까? 파일을 어디에 쓸 것으로 예상합니까? 나는 XSLT 프로세서가 설치된 자신의 시스템이나 설치된 XML IDE와 같은 환경에서 프로세서가 결과를 출력하기 위해 파일 시스템에 액세스 할 수있는 권한이 있는지 확인할 수있는 방법을 제안합니다. –

+0

죄송합니다. 대상 환경 (이 기능을 지원하는 업체에서 말한 것입니다)에서이 작업을 시도해 보았습니다. 또한 이와 비슷한 모호한 오류가 발생했습니다. – Matt

+0

출력 형식이 일반 텍스트라고 가정하면'href = "file _ {@ ReportName} -output.xml"''.xml'을 사용하는 이유가 궁금합니다. 나는 왜 당신이'@ ReportName'을 가지고 있는지 의아하게 생각합니다, 당신은 단지 그 이름의 엘리먼트와 그 이름의 애트리뷰트를 가지지 않기 때문에'ReportName'을 대신 쓰고 싶다고 생각합니다. –

답변

0

우선 xpath에 사용 된 네임 스페이스 접두사가 <xsl:for-each select="/Report_Data/Report_Entry">인데 입력 된 xml에는이 이름 공간 접두어가 있습니다. 그래서 저는 여러분의 변혁으로 인해 결과가 나오지 않을 것이라고 생각합니다.
네임 스페이스 접두사를 지정할 수 있습니다 (urn:(someURN)). xpath에 요소와 동일한 접두사를 사용해야합니다. 이 명령이 가능하지 않을 수도 있습니다 로컬 파일을 작성하는 프로세서를 지시하는 것처럼 xsl:result-document를 사용하는 동안
예를 들어, xmlns:ns="urn:(someURN)"
<xsl:for-each select="/ns:Report_Data/ns:Report_Entry">

웹 사이트 (외부 자원)의 사용은 문제가 될 수 있습니다.
로컬 프로세서를 사용하고 변환을 시도해 보시기 바랍니다.

+0

누락 된 네임 스페이스는 단지 살균의 인공물 일 뿐이다. 결과 문서없이 제대로 작동합니다. 웹 사이트에서 파일을 텍스트로 표시 할 것을 기대했지만 다른 출력이있는 것처럼 보였습니다. 문제가 될 수 있다고 생각합니다. 불행히도 이미 대상 시스템에서이 작업을 시도했지만 비슷한 오류가 발생했습니다. 필자는 XSL 2.0에서 대상 시스템이이 기능을 지원한다고 말했기 때문에 문제는 키보드와 의자 사이에 설치된 구현 시스템에 있다고 생각합니다. – Matt

0

메시지는

Error: Internal error evaluating template rule

자주 Saxonica에게보고해야합니다 색슨 내에서 내부 버그를 나타냅니다. 그러나 OutputURIResolver와 같은 "콜백"메소드를 통해 트리거 될 수 있습니다. 예를 들어,이 온라인 서비스를 구현하는 사람들은 xsl : result-document가 호출 될 때 무조건 예외를 throw하는 OutputURIResolver를 사용합니다 (Saxon을 구성하는 더 깨끗한 방법이 있어도 동일한 효과를 얻을 수 있습니다).

Saxon이 어떻게 구성되었는지 정확하게 알고있는 환경에서 재생산 할 수있는 경우에만 Saxonica에보고 해주십시오.