2014-04-24 3 views
0

태그 값이 내 변수와 일치하는지 테스트해야합니다. 내 입력 XML 뭔가 보일 수 있습니다 : 나는 userId 's의 쉼표로 구분 된 목록으로 전역 변수를 만든XSLT 변수의 값 일치

<root> 
    <userid>user1<userid> 
    <performance> 
     <doOne> 

     </doOne> 
    </performance> 
</root> 

을, 나는,이 사용자가 doOne을 수행 할 수 있는지 여부를 확인해야 즉

<xsl:variable name="performerable"> 
    <perform name="doOne" users="user3, user6, user1"/> 
    <perform name="doTwo" users="user7, user2, user6"/> 
</xsl:variable> 

나는 사용자가 perform의 존재 여부를 확인할 때, 나는 다음과 같은 설정에 오류가 발생합니다 :

<xsl:choose> 
    <xsl:when test="contains($performerable/perform[name='doOne'].users, 'user6')"> 
     <accepted> 
    </xsl:when> 
</xsl:choose> 

javax.xml.transform.TransformerException: Expected ,, but found: .users 

답변

1

올바른 XPath 표현식이

$performerable/perform[@name='doOne']/@users 

될 이름 doOne이있는 perform 요소에서 users 속성을 추출 할 수 있지만 이것은 단지 것입니다 : D 이클립스 XSL 어트 변환을 통해 그것을 실행, 나는 다음과 같은 수 XSLT 2.0 - 1.0에서 작동합니다 (javax.xml.transform이 프로젝트에 Saxon 9를 특별히 포함하지 않은 경우). select 표현식으로 정의 된 변수 만 내용으로 정의 된 내부 변수를보기 위해 XPath를 사용할 수 없습니다. 내용이 포함 된 변수의 값은 "result tree fragment"이며, value-of 또는 copy-of을 사용할 수 있지만 적절한 노드 집합 인 경우 XPath를 사용하여 내부에서 볼 수있는 것은 아닙니다.

이와 같이 완전히 정적 인 데이터 조각을 가지고있는 경우 document 함수로 할 수있는 속임수가있어 스타일 시트 자체를 다른 입력 XML 문서로 취급하므로 관련 비트를 노드 집합으로 액세스하지 않고 조각 :

<xsl:variable name="performerableRtf"> 
    <perform name="doOne" users="user3, user6, user1"/> 
    <perform name="doTwo" users="user7, user2, user6"/> 
</xsl:variable> 

<xsl:variable name="performerable" select="document('')//xsl:variable[@name='performerableRtf']"/> 

하지만 난 당신이 약간 XML 표현을 변경 추천 할 것입니다 - 쉼표로 구분 된 목록이 아니라 각 ID에 대해 별도의 요소를 사용하는 경우 :

<xsl:variable name="performerableRtf"> 
    <perform name="doOne"> 
    <u>user3</u> 
    <u>user6</u> 
    <u>user1</u> 
    </perform> 
    <!-- ... --> 
</xsl:variable> 

<xsl:variable name="performerable" select="document('')//xsl:variable[@name='performerableRtf']"/> 

그런 다음 테스트로된다 imple 같음 :

$performerable/perform[@name='doOne']/u = 'user6' 

측면 중 하나 (또는 ​​둘 다)에 설정된 노드와 = 비교 한쪽 어떤 노드가 다른 임의의 노드와 일치하는 경우 성공 이후.

+0

저는 XSLT 1.0을 사용하고 있습니다. 그래서'xsl : when'은'select' 표현식을 가지고 있지 않기 때문에 어떻게해야합니까? – Malvon

+0

@Malvon'document ('') '트릭을 설명하기 위해 편집했습니다. –