2014-09-17 3 views
0

나는 아래 XML 파일 2 개를 가지고있다.예외를 던지는 패턴 일치

Title.XML

<?xml version="1.0" encoding="UTF-8"?> 
<entry> 
<file name="LCCPMY_CH_01.xml"></file> 
</entry> 

Contents.xml

<toc-pg>1</toc-pg> 

LCCPMY_CH_01.xml의 내용은 아래와 같다. 여기에 내가 어떻게하고 content.xml 파일, Title.xml 파일의 도움을 사용하는 것입니다 노력하고있어

<chapter num="A"> 
    <section level="sect1"> 
    <page num="1"/> 
     <title> 
      <content-style font-style="bold">Chapter 1: This is Chapter</content-style> 
     </title> 
     </section> 
</chapter> 

, 내가 수 (page num of LCCPMY_CH_01.xml is equal to Contents.xml toc-pg value)와 일치하는 것을 시도하고있다. 나는 그것을하기 위해 아래의 XSLT를 사용하고있다.

<xsl:template match="toc-pg" mode="x"> 
<xsl:variable name="dot" select="."/> 
    <xsl:analyze-string select="." regex="([0-9]+)"> 
     <xsl:matching-substring> 
      <xsl:variable name="prent"> 
       <xsl:for-each select="document('C:\Users\u0138039\Desktop\Proview\MY\2014\The Law of Costs in Civil Proceedings\title.xml')/entry/file"> 
        <xsl:value-of select="normalize-space(document(concat('C:\Users\u0138039\Desktop\Proview\MY\2014\The Law of Costs in Civil Proceedings\',./@name))/chapter/section[@level='sect1']/substring-after(fn:substring-before(.,':'),' ')[//page/@num=regex-group(1)]|a[//page/@num=regex-group(1)])"/> 
       </xsl:for-each> 
      </xsl:variable> 
      <xsl:variable name="cha"> 
       <xsl:value-of select="$prent"/> 
      </xsl:variable> 
      <xsl:variable name="size"> 
       <xsl:value-of select="string-length($cha)"/> 
      </xsl:variable> 
      <xsl:variable name="conct"> 
       <xsl:choose> 
        <xsl:when test="$size>'1'"> 
         <xsl:value-of select="concat('er:#LCCPMY_CH_',$cha,'/pg_',.)"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="concat('er:#LCCPMY_CH_0',$cha,'/pg_',.)"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:variable> 
      <a href="{$conct}"> 
       <xsl:value-of select="regex-group(1)"/> 
      </a> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

하지만이 코드를 실행하면 예외가 발생합니다.

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Proview/MY/2014/The%20Law%20of%20Costs%20in%20Civil%20Proceedings/09172014/XSLT/MCCL_TOC_01.xsl:235: Not a node item - item has type xs:string with value '1' - Details: -  XPTY0020: The context item in an axis step must be a node 

제가 잘못 가고 있으며 어떻게 해결할 수 있는지 알려주세요. 나는 XSLT 2.0을 사용한다.

감사 의견에서 언급 한 바와 같이

+0

는이'> 라인 235? 그렇다면,이 변경해야합니다'' –

+0

안녕하세요 @ JoelM.Lamsen, 답장을 주셔서 감사합니다, 표시된 오류는 ' – user3872094

+0

문제는 문맥 항목이 문자열이고, 문자열이 어떤 문서에도 속하지 않으므로 'page'요소에 접근하기 위해'// page '를 사용하는 술어'[// page/@ num =.]' 문서에서 원하는 문서가 명확하지 않으므로 작동하지 않습니다. 검색 할 문서를 설명하거나 예를 들어 해당 문서의 루트 노드를 저장하는 외부 변수를 정의하십시오. ''그리고 나서'[$ doc // page/@ num =.]'에 접근한다. –

답변

1

는, 문제는이 라인이다 :

<xsl:value-of select="normalize-space(document(concat('C:\Users\u0138039\Desktop\Proview\MY\2014\The Law of Costs in Civil Proceedings\',./@name))/chapter/section[@level='sect1']/substring-after(fn:substring-before(.,':'),' ')[//page/@num=regex-group(1)]|a[//page/@num=regex-group(1)])"/> 

이 분명이 더 쇼가 document 전화가 지금은 변수 $doc-lccpmy에 저장된 가정하자하십시오. 그런 다음 들여 쓰기를하면 다음과 같이 보입니다.

<xsl:value-of select=" 
    normalize-space(
     $doc-lccpmy/chapter/section[@level='sect1']/substring-after(substring-before(.,':'),' ')[//page/@num=regex-group(1)] 
     | 
     a[//page/@num=regex-group(1)] 
    )"/> 

몇 가지 문제가 있습니다. 첫째, MartinHonnen이 지적한 바와 같이 문맥이 노드 일 때 문자열에 표현식 [//page/@num=regex-group(1)]을 적용하려고합니다. 이 문제를 해결하려면 식의 첫 번째 부분은 (아마도)이 //section 요소가 상대적으로 만들기 위해 제거 된없는 방법 또한이

$doc-lccpmy/chapter/section[@level='sect1'][page/@num=regex-group(1)]/substring-after(substring-before(.,':'),' ') 

해야한다.

다른 문제는 유니온 연산자 인 |을 사용하는 것입니다 ('또는'연산자가 아닙니다). 당신이 그것을 사용하는 위치에이를 이용하여

$doc-lccpmy/... | a[//page/@num=regex-group(1)] 

, 당신은 노드의 시퀀스를 반환하는 두 개의 노드 집합의 합집합을 반환되며, 시퀀스는 normalize-space 함수의 인수로 사용할 수 없습니다 .당신의 XML 샘플은 a 요소가 없기 때문에

불행하게도, 정확히 그것을 해결하기 위해 수행해야 할 분명한 아니지만, 그것은 아마도,이

$doc-lccpmy/chapter/section[@level='sect1'][page/@num=regex-group(1) or a/page/@num=regex-group(1)]/substring-after(substring-before(.,':'),' ') 

같이 할 필요가 또는

<xsl:value-of select="normalize-space(document(concat('C:\Users\u0138039\Desktop\Proview\MY\20‌​14\The Law of Costs in Civil Proceedings\',./@name))/chapter/section[@level='sect1'][page/@num=regex-group(1) or a/page/@num=regex-group(1)]/substring-after(substring-before(.,':'),' '))"/> 

을 아니면이 : 긴 형식이 시도

<xsl:value-of select="normalize-space(substring-after(substring-before(document(concat('C:\Users\u0138039\Desktop\Proview\MY\20‌​14\The Law of Costs in Civil Proceedings\',./@name))/chapter/section[@level='sect1'][page/@num=regex-group(1) or a/page/@num=regex-group(1)],':'),' '))"/> 
+0

이것은 매력 @ TimC처럼 작동합니다. 감사 – user3872094