2012-03-29 41 views
5

Có cách nào hạn chế một phần của XSLT thành một nút duy nhất, sao cho toàn bộ đường dẫn của nút không cần thiết mỗi lần?Giới hạn phần XSLT thành một nút

Ví dụ ...

Name: <xsl:value-of select="/root/item[@attrib=1]/name"/> 
Age: <xsl:value-of select="/root/item[@attrib=1]/age"/> 

này có thể được thực hiện thông qua một for-each lệnh, nhưng tôi dẫn dắt để tin rằng những nên tránh nếu có thể ...

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

Tôi đoán tôi đang hỏi nếu có một XSLT tương đương với VB.NET Với lệnh?

Tôi muốn tránh xsl: template cho dễ đọc, vì tệp XSLT được đề cập là lớn, nhưng vui lòng chấp nhận nếu đó là cách duy nhất để thực hiện. Và nếu có, cú pháp gọi một mẫu cụ thể dựa trên nút cụ thể là gì?

Cập nhật

Trong theo dõi câu trả lời bằng cách @javram, nó có thể phù hợp với các mẫu riêng biệt dựa trên các thuộc tính đặc biệt/nút.

<xsl:apply-templates select="/root/item[@attrib=1]"/> 
<xsl:apply-templates select="/root/item[@attrib=2]"/> 

<xsl:template match="/root/item[@attrib=1]"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 

<xsl:template match="/root/item[@attrib=2]"> 
    Foo: <xsl:value-of select="foo"/> 
</xsl:template> 
+0

Không có gì sai khi sử dụng 'xsl: for-each' như bạn đang làm ở đây. Trong trường hợp này, nó hoạt động tốt theo kiểu "có". Mọi người khuyên không nên sử dụng 'xsl: for-each' để lặp lại một cách rõ ràng thứ gì đó khi XSLT cung cấp các cách tốt hơn để làm tương đương, chẳng hạn như cho phép các mẫu áp dụng và khớp. –

+0

Downvoter ... tôi có thể hỏi tại sao và sau quá lâu không? – freefaller

+0

Downvoter ... không, tôi không nghĩ như vậy ... bạn chỉ cần ẩn đằng sau sự ẩn danh của SO, chứ không phải là xây dựng. Cảm ơn, cảm ơn rất nhiều! – freefaller

Trả lời

2

Cách đúng sẽ được sử dụng một mẫu:

<xsl:apply-templates select="/root/item[@attrib=1]"/> 

. 
. 
. 

<xsl:template match="/root/item"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 
+0

Mặc dù nó không phải là trực quan tốt đẹp như là một "Với" loại khối, tôi nghĩ rằng bạn đang phải rằng đây là cách chính xác để làm điều đó. Làm theo các câu hỏi không được phép thông qua các bình luận, bạn có đủ sức để cho thấy bạn sẽ phù hợp với một khuôn mẫu khác như thế nào nếu @attrib bị thay đổi?Tôi sẽ cập nhật câu hỏi của tôi để phản ánh yêu cầu này – freefaller

+0

Vui lòng bỏ qua câu hỏi tiếp theo, điều này khá dễ dàng hơn tôi nghĩ, tôi đã cập nhật câu hỏi của mình một cách thích hợp – freefaller

+0

Trong bản cập nhật tiếp theo của bạn, bạn cũng có thể thực hiện: sẽ lưu một dòng mã. Vì thuộc tính đã được bao gồm trong tiêu chí đối sánh riêng biệt, cả hai mẫu sẽ vẫn bị truy cập. – javram

2

Bạn có thể sử dụng các biến:

<xsl:variable name="foo" select="/root/item[@attrib=1]" /> 

<xsl:value-of select="$foo/name" /> 
<xsl:value-of select="$foo/age" /> 
+0

Tôi không có ý tưởng rằng các biến cũng có thể giữ các nút, cảm ơn bạn vì điều này. – freefaller

0

Trong XSLT 2.0 khác phong cách có thể là:

<xsl:value-of select='/root/item[@attrib=1]/ 
         concat("Name: ", name, " Age: ", age)'/> 
+0

Thật không may chúng tôi vẫn còn trên 1.0, và khối "Với" bao gồm là quá lớn cho "concat" là hữu ích. Nhưng tôi đánh giá cao đầu vào, cảm ơn bạn. – freefaller

0

Điều này:

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

hạ xuống tất cả các nút (mỗi nút phù hợp, từng nút một).

này:

<xsl:for-each select="(/root/item[@attrib=1])[1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

descents vào đầu tiên (có thể là duy nhất) phù hợp với nút và là tương đương với VB.NET With tuyên bố như bạn mong muốn.

Các vấn đề liên quan