2012-09-19 4 views
2

이 샘플 파일을 고려하시기 바랍니다 : http://www.w3schools.com/dom/books.xml하위 문자열

이 XPath 식 //title/text() 것은, 반환

매일 이탈리아어
해리 포터
XQuery를 킥은 XML 학습
를 시작

이제 저는 첫 번째 이름 만 원합니다. 시도 : tokenize(//title/text(),' ')[1]을 반환 :

너무 많은 항목

OTOH tokenize((//title/text())[1],' ')[1] 처음 노드의 이름을 반환

을.

노드를 반복하는 동안 XPath로 하위 문자열을 가져 오는 방법은 무엇입니까?

+0

세타, 내 대답은 당신에게 도움이 되었습니까 또는 당신은 여전히 ​​어떤 문제가 있습니까? 현재 허용되는 답변보다 최소 두 배 더 짧으며 더 효율적이라는 것을 알고 계셨습니까? –

+0

감사합니다. Dimitre. 추가 답변 (내가 투표 한 내용) 및 포함 된 추가 정보 및 추가 설명을 보내 주셔서 감사합니다. 그것은 매우 유용하며, 다른 사람들도 곧 투표 할 수 있기를 바랍니다. 나는 Cylian의 답을 올바른 것으로 이미 표시했다. 실수를 보여 주었고 내 문제를 해결할 수있는 해결책으로'title/tokenize (text(), '') [1]'해결책으로 이끌었다. 환호 – theta

답변

1

1. 얻으려면 마지막 하나를 제외한 모든 부품이 사용하십시오 :

//title/string-join(tokenize(.,'\s+')[position() ne last()],' ') 

또는

2 만 첫 번째 사용을 얻으려면이 :

//title/string-join(tokenize(.,'\s+')[position() eq 1],' ') 

희망이 도움이됩니다.

+0

아, 고마워, 그 단서를 줘. 따라서 전체 XPath 표현식에서 함수를 호출해서는 안되며 텍스트를 리턴하는 부분에서만 함수를 호출해야합니다. 그러나 이것은 훨씬 더 간단합니다.'//title/tokenize (text(), '') [1]'그것은 훌륭하게 작동합니다. 환호 – theta

+0

당신을 환영합니다! – Cylian

2

사용 :

//text()/tokenize(.,' ')[1] 

이 XML 문서의 모든 텍스트 노드의 첫 번째 "단어"의 시퀀스를 생성합니다.

XSLT 2.0 - 대조 :

이 변환은 다음과 같은 XML 문서에 적용
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select="//text()/tokenize(.,' ')[1]"/> 
</xsl:template> 
</xsl:stylesheet> 

:

<t> 
    <a>Everyday Italian</a> 
    <b>Harry Potter</b> 
    <c>XQuery Kick Start</c> 
    <d>Learning XML</d> 
</t> 

는 XPath 식을 평가하고,이 결과 평가는 출력에 복사됩니다.

Everyday 
Harry 
XQuery 
Learning 

위에는 몇 개의 공백 문자 노드 만 포함되어 있습니다.

당신이에 XPath 식을 변경, 공백 전용 텍스트 노드를 무시하려면

:

//text()[normalize-space()]/tokenize(.,' ')[1]