2014-02-19 2 views
0

(여기에 모든 코드가 원래 버전의에서 단순화) 함수에서 반환문자열로 XSLT 템플릿을 적용은

우리 회사는 우리의 파일 시스템에서 파일의 내용을 반환 XSLT (1.0)에서 사용하는 기능을 가지고

. 나는 apply-templates을 사용하여 함수의 반환을 구문 분석 할 수 있어야합니다.

홈페이지 XML 파일 :

<exhibit> 
    <exhibitTitle>Exhibit</exhibitTitle> 
    <linkedAsset href="path/to/file.xml" /> 
</exhibit> 

외부 XML 파일 :

<externalAsset editable="true" id="U10250926378W6C"> 
    <img src="path/to/image.png" /> 
    <caption>Some default image</caption> 
<externalAsset> 
나는 주요 XML 파일에 다음 XSLT를 적용하려고

:

다음 예를 살펴 보겠습니다

XSLT는 :

<xsl:template match="linkedAsset"> 
    <xsl:apply-templates select="cus:getFileByUri(./@href)" /> 
</xsl:template> 

<xsl:template match="img"> 
    <xsl:text>|-- Begin Image Source --|</xsl:text> 
    <xsl:value-of select="./src" /> 
    </xsl:text>|-- End Image Source --|</xsl:text> 
</xsl:template> 

이 결과는 단순히 "일부 기본 이미지"이었다.

내가 XML 구조를 얻고 있었다 확인하고,뿐만 아니라 모든 노드의 값 (또는 무언가) 만들려면 내가 시도 :

<externalAsset editable="true" id="U10250926378W6C"> 
    <img src="path/to/image.png" /> 
    <caption>Some default image</caption> 
<externalAsset> 
: 원래 외부 XML 파일 구조를 반환

<xsl:template match="linkedAsset"> 
    <xsl:copy-of select="cus:getFileByUri(./@href)" /> 
</xsl:template> 

는 또한 시도 : 예상대로 "경로 /로는 /의 image.png"를 반환

<xsl:template match="linkedAsset"> 
    <xsl:value-of select="cus:getFileByUri(./@href)//img/@src" /> 
</xsl:template> 

.

<xsl:template match="linkedAsset"> 
    <xsl:call-template name="renderExternal"> 
     <xsl:with-param name="asset" select="cus:getFileByUri(./@href)" /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="renderExternal"> 
    <xsl:param name="asset" select="." /> 
    <xsl:apply-templates select="$asset" /> 
</xsl:template> 

출력은 원래 apply-template으로 동일 하였다 :

마지막 this question의 응답에 따라, I는 다음의 XSLT를 시도했다.

apply-templates을 함수에서 반환 된 값에 적용 할 수있는 방법이 있습니까? 나는 명확하게 문자열을 copy-of, value-of으로 전송할 수 있으며 심지어 xpath를 수행한다. apply-templates과 함께 사용하면 안됩니까? 이 선택한 답변의


설명 그것이 나오는 것에 따라

, 내 문제에 대한 해결책은 내가 같은 템플릿 것을 일치하는 노드에 템플릿을 적용하고 같으면 '한 (꽤 특이 내가 제공 한 코드의 단순화 된 버전에서 분명히 알 수 있습니다.) 나는이 점에서 정말로 -1 점을 얻었다. 아무데도, 나는이 문제를 방문하는 사람들에게 keshlam의 대답이 가장 도움이 될 것이라고 생각합니다. 문제는 내 문제라고 대답했습니다.

+1

"* 이것을 수행 할 방법이 있습니까? *" "this"는 정확히 무엇입니까? 노력하고 일하지 않은 모든 것들 사이에 숨어 있다면 확실하게 놓쳤습니다. 알 수없는 함수를 사용하고 있다는 사실은 도움이되지 않습니다. 여기에서 성취하고자하는 목표와 관련이 있습니까? –

+0

@ michael.hor257k 그래, 함수에 대해 미안 하네, 나는 함수가 어떻게 작동 하는지를 알기 위해 XSLT에 대해 충분히 알지 못한다고 생각한다. 나는 단지 그것들이 모두 반환 된 문자열이라고 가정했다. 어쨌든, 나는 * 내가 * *이 * 처음 두 문장에 있다고 말했어. 분명히함으로써 -1을 들게 할 수 있다면 기꺼이 그 일을 할 것이다. , 나는 그들이 돕길 바란다). –

+0

당신은 -1을 들어 올리도록 설득 할 수 없습니다. 왜냐하면 거기에 넣지 않았기 때문입니다. 간단히 말해, 모든 함수가 문자열을 반환하지는 않습니다. 일부는 다른 데이터 유형을 반환합니다. 여기서 주목할만한 것은 * result-tree-fragment *와 * node-set * 타입이다. 귀하의 질문에 어떤 시점에서 우리는 실제 결과가 함수에 의해 반환 볼 수 있습니다. 그것을 보는 것이 어떤 데이터 유형인지를 반드시 의미하는 것은 아니지만 시작일 것임을주의하십시오. 왜''를 호출하고 그 결과를 게시 하시겠습니까? –

답변

1

적용 템플릿을 실행하려면 XML을 이미 구문 분석 된 형식 (일반적으로 DOM 트리 또는 NodeIterator)으로 스타일 시트에 반환해야합니다. XSLT 1.0에서는 exslt:node-set() 확장 함수를 적용해야 할 수 있습니다. 또는 임시 트리와 노드 집합 간의 임피던스 불일치 (xsl : apply-templates가 노드 집합에서 작동 함)를 처리하기 위해 해당 프로세서와 동일합니다.

확장 프로그램 작성 및 등록에 대한 세부 사항은 프로세서마다 다를 수 있습니다. 예를 들어, Xalan-J를 사용하는 경우 https://xml.apache.org/xalan-j/extensions.html

+0

내 문제는 완전히 다른 것으로 판명되었지만 이것이 내 문제가 해결 된 최선의 대답입니다. 감사! –

관련 문제