2013-03-19 33 views
5

Tôi đang học XSL ngay bây giờ và có câu hỏi liên quan đến tham chiếu chéo. Tệp XML mục tiêu của tôi được cấu trúc như sau:Tham khảo chéo XSL

<XML> 
    <Model> 
     <packedElement typ="class" id="1"/> 
     <packedElement typ="class" id="2"/> 
     <packedElement typ="class" id="3"/> 
    </Model> 
    <Elements> 
     <Element idref="1"> 
      <Attributes comment="comment 1."/> 
     </Element> 
     <Element idref="2"> 
      <Attributes comment="comment 2."/> 
     </Element> 
     <Element idref="3"> 
      <Attributes comment="comment 3."/> 
     </Element> 
    </Elements> 
</XML> 

Tôi muốn kết nối id = idref. Mục tiêu của tôi là liệt kê tất cả các gói phần mềm đóng gói và in nhận xét của họ. Các bạn có thể giúp tôi không?

Tôi đã cố gắng giải quyết vấn đề này bằng khóa-funktion, nhưng tôi đã không thành công lắm.

Edit:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
<xsl:output method="xml" encoding="UTF-8"/> 

<xsl:key name="CommentK" match="Element" use="@idref"/> 


<xsl:template match="XML"> 
<XML> 
<xsl:apply-templates/> 
</XML> 
</xsl:template> 

<xsl:template name="Start" match="packedElement"> 
<xsl:variable name="TEST" select="@id"/> 
<xsl:variable name="Comment"> 
<xsl:call-template name="FindComment"> 
<xsl:with-param name="test2" select="@id"/> 
</xsl:call-template> 
</xsl:variable> 
<content comment="{$Comment}" id ="{@id}" test="{$TEST}"></content> 
</xsl:template> 

<xsl:template name="FindComment"> 
<xsl:param name="test2"/> 

<xsl:for-each select="key('CommentK', '$test2')"> 

<xsl:value-of select="Attributes/@comment"/> 

</xsl:for-each> 

</xsl:template> 

</xsl:stylesheet> 

phiên bản XSLT là 2.0. (Btw ai đó có thể cho tôi biết sự khác biệt giữa .XSLT và .xsl?)

+0

XSLT 1.0 hoặc 2.0? –

+0

Nỗ lực của bạn trông như thế nào? Bạn muốn kết quả trông như thế nào? – JLRishe

+0

Tôi nghĩ rằng nỗ lực của bạn sẽ gần như hiệu quả, ngoại trừ việc bạn đã sử dụng ''$ test2'' là giá trị _string_" $ test2 ". Nó chỉ nên là 'khóa' ('CommentK', $ test2) '. Tôi nghĩ rằng 'FindComment' và' for-each' là quá mức cần thiết. Câu trả lời của Martin Honnen là một câu trả lời hay. – JLRishe

Trả lời

6

Hãy thử

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="el-by-idref" match="Elements/Element" use="@idref"/> 

<xsl:template match="XML"> 
    <xsl:copy> 
    <xsl:apply-templates select="Model/packedElement"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Model/packedElement"> 
    <content comment="{key('el-by-idref', @id)/Attributes/@comment}" id="{@id}" test="{@id}"/> 
</xsl:template> 



</xsl:stylesheet> 

cách mà bạn nhận được

<XML> 
    <content comment="comment 1." id="1" test="1"/> 
    <content comment="comment 2." id="2" test="2"/> 
    <content comment="comment 3." id="3" test="3"/> 
</XML> 
+0

Wow .. cảm ơn sự trợ giúp rất nhanh !! Đó là những gì tôi tìm kiếm. Đó là một tập tin mục tiêu rất đơn giản, bây giờ tôi cố gắng viết mã cho big-xml. Cảm ơn bạn! – gs3rr4