2014-07-22 5 views
0

내가해야 할 일은 xsl 변수의 값을 넣고 새 변수 이름으로 설정하는 것입니다.다른 변수의 이름으로 xsl : 변수를 사용하는 방법

내 문제 :

검색 값의 긴 문자열 인 XML 파일의 항목이 (내가 제어 할 수 해달라고)가

.

이 문제는 용어가 항상 같은 순서로 나타나거나 전혀 나타나지 않는다는 것입니다
jobSearch=12345;nameSearch=Joe;colorSearch=Blue 

이, 때로는 될 수 있습니다 :

colorSearch=Blue;jobSearch=12345;nameSearch=Joe 

또는 단지 : 그것은 다음과 같이 보입니다

jobSearch=12345 

문자열을 개별 구성 요소로 나눌 수는 있지만 검색 유형을 검색 값에 연결하는 방법을 파악할 수 없습니다. 나중에 xsl에서 이러한 변수를 검색 유형으로 호출하고 싶습니다. 나는 어쩌면 호출 템플릿 루프에서 이것을 할 수있을 것이라고 생각했지만 변수가 범위를 벗어날 때 떠났다. 어떤 도움이라도 대단히 감사 할 것입니다. 감사합니다.

편집 : 다니엘 헤일리는 단지 1.0 당신은 할 수 없습니다

+1

XSLT에서는 불가능한 일이므로 잘못된 방향으로 가고 있을지도 모릅니다. 당신이 달성하고자하는 것에 대해 좀 더 자세하게 설명한다면 (단지 '방법'이라기보다는) 대체 접근법을 제안 할 수 있습니다. 고맙습니다! –

+1

"xsl에서 검색 유형 *에 따라 나중에이 변수를 호출 할 때"무엇을 의미하는지 명확히 할 수 있습니까? - 또한 사용중인 XSLT 버전을 알려주십시오. –

+0

"나중에 키 - 값 쌍을 찾기 위해 용어에 액세스한다는 측면에서 * *"아무 의미도 없습니다. 이미 * 키 - 값 쌍의 배열이 있습니다. 유일한 문제는 현재 형태로 배열에 액세스하는 것이 편리하지 않다는 것입니다. 따라서 어레이를보다 유용하게 사용할 수있는 것으로 바꾸거나, 그대로두고 원하는 곳에서 필요할 때 추출하는 방법을 보려고 노력하는 것이 더 효율적입니다. –

답변

1

에 명시된 바와 같이 나는 XSLT 1.0을 사용하여 키 - 값 쌍을 찾고 뒷부분에 나오는 용어를 접근의 관점에서하고 있습니다. 존재하지 않는 언어 기능을 발명하는 대신 해결하려는 문제를 알려 주시면 문제 해결 방법을 알려 드릴 수 있습니다.

+0

네, 그런 식으로 작동하지 않는다고 생각했습니다. 미안 해요. 나는 그 질문을 갱신했다. 감사. – user3866261

+0

기록을 위해 제 답변은 완전히 다른 질문에 대한 답변이었습니다. –

0

나는 귀하의 질문을 이해한다고 생각합니다; 문자열의 각 "검색 유형"에 대해 키 - 값 쌍을 얻으려고합니다. 따라서 "colorSearch"= "blue", "jobSearch"= "12345"및 "nameSearch"= "Joe"입니다. 옳은?

XSLT의 버전을 지정하지 않았으므로 여기에 2 가지 방법이 나와 있습니다. 하나는 나중에 쿼리 할 수있는 XML을 만드는 것입니다. 다른 하나는 map을 작성하는 것입니다. 첫 번째 방법은 XSLT 2.0 및 3.0에서 작동합니다. 두 번째 방법은 XSLT 3.0에서만 작동합니다. (I 테스트를 위해 색슨-PE를 사용했다.)

XML 입력

<example>jobSearch=12345;nameSearch=Joe;colorSearch=Blue</example> 

XSLT (쇼 키 - 값 쌍을 만든 다음을 참조하십시오.)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:map="http://www.w3.org/2005/xpath-functions/map" 
    exclude-result-prefixes="xs map"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="possible-types" select="('jobSearch','nameSearch', 
     'colorSearch')"/> 

    <!--METHOD 1--> 
    <!--XSLT 2.0--> 
    <xsl:variable name="searchTypes"> 
     <xsl:for-each select="tokenize(.,';')"> 
      <xsl:element name="{tokenize(.,'=')[1]}"> 
       <xsl:value-of select="tokenize(.,'=')[2]"/> 
      </xsl:element> 
     </xsl:for-each>   
    </xsl:variable> 

    <!--METHOD 2--> 
    <!--XSLT 3.0--> 
    <xsl:variable name="type-map" as="map(xs:string, xs:string)" 
     select="map:new(
     for $type in tokenize(/*,';') 
     return 
     map{tokenize($type,'=')[1] := tokenize($type,'=')[2]} 
     )"/> 

    <xsl:template match="/"> 
     <results> 
      <xsl:for-each select="$possible-types"> 
       <search-type name="{.}" 
        method1value="{$searchTypes/*[name()=current()]}" 
        method2value="{$type-map(current())}"/> 
      </xsl:for-each> 
     </results> 
    </xsl:template> 

</xsl:stylesheet> 

출력

<results> 
    <search-type name="jobSearch" method1value="12345" method2value="12345"/> 
    <search-type name="nameSearch" method1value="Joe" method2value="Joe"/> 
    <search-type name="colorSearch" method1value="Blue" method2value="Blue"/> 
</results> 
+0

그게 정확히 내가 원하는 것입니다. 불행히도이 문제는 언급하지 않았지만 XSLT 1.0을 사용하고 있습니다. 이 버전이 가능합니까? – user3866261

관련 문제