2011-01-25 21 views
5

hi tôi có một tài liệu xml sitemap mà trông giống như sauXSLT copy-of không có con

<pagenode title="home" url="~/" fornavbar="true"> 
<pagenode title="admin" url="~/admin" fornavbar="false"> 
    <pagenode title="users" url="~/admin/users" fornavbar="false"/> 
    <pagenode title="events" url="~/admin/events" fornavbar="true"/> 
</pagenode> 
<pagenode title="catalog" url="~/catalog" fornavbar="true"/> 
<pagenode title="contact us" url="~/contactus" fornavbar="false"/> 
</pagenode> 

bây giờ tôi muốn lấy một tài liệu xml cho navbar, trong đó bao gồm tất cả các pagenodes có fornavbar = thật. Điều này có thể giải quyết như thế nào?

gần nhất tôi đã có thể để có được cho đến nay là thế này:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="pagenode[@fornavbar='true']"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

vấn đề với điều này là bao gồm tất cả các trẻ em bất cứ điều gì phù hợp như navbar

tôi chỉ muốn sao chép tất cả các thuộc tính , không phải tất cả các trẻ em

nhưng nếu tôi cố gắng

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="pagenode[@fornavbar='true']"> 
    <pagenode title="{@title}" url="{@url}"/> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

sau đó tôi có 2 vấn đề

  1. tôi có thể gõ ra từng thuộc tính riêng biệt, và tôi có khá nhiều mỗi trang và họ đang apt để thay đổi cuối cùng
  2. nó sẽ mất thứ bậc. mọi thứ trở nên bằng phẳng sau khi khác

tôi sẽ đánh giá cao tất cả và mọi trợ giúp trong vấn đề.

cảm ơn bạn!

EDIT: sản lượng mẫu mà id muốn thấy

<pagenode title="home" url="~/" fornavbar="true"> 
<pagenode title="events" url="~/admin/events" fornavbar="true"/> 
<pagenode title="catalog" url="~/catalog" fornavbar="true"/> 
</pagenode> 
+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho một giải pháp hoàn chỉnh nhưng rất ngắn, khai thác triệt để mẫu thiết kế XSLT cơ bản nhất. :) –

Trả lời

2

bạn có thể lặp qua các thuộc tính của một nút sử dụng xsl:foreach select="@*" cách này bạn không cần phải sao chép các thuộc tính bằng tay. nếu bạn gọi xsl:apply-templates bên trong phần tử pagenode yor, bạn sẽ nhận được kết quả mong muốn.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="pagenode[@fornavbar='true']"> 
     <pagenode> 
      <xsl:for-each select="@*"> 
       <xsl:attribute name="{name(.)}"><xsl:value-of select="."/></xsl:attribute> 
      </xsl:for-each> 
      <xsl:apply-templates/> 
     </pagenode> 
    </xsl:template> 
</xsl:stylesheet> 

làm

<?xml version="1.0"?> 
<pagenode title="home" url="~/" fornavbar="true"> 
    <pagenode title="events" url="~/admin/events" fornavbar="true"/> 
    <pagenode title="catalog" url="~/catalog" fornavbar="true"/> 
</pagenode> 
+1

'' ngắn gọn hơn nhiều –

+0

cảm ơn một triệu! nó hoạt động chính xác những gì tôi cần !!! your'e tuyệt vời! –

1

XSLT sẽ trông như thế này:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="pagenode[@fornavbar='true']"> 
    <pagenode> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </pagenode> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Phải là thức ăn thừa từ thử nghiệm của tôi. – akond

+0

+1 Để có hiệu chỉnh đơn giản nhất. –

3

Đây có lẽ là giải pháp XSLT ngắn nhất và tinh khiết nhất:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[@fornavbar = 'false']"> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

khi chuyển đổi này được áp dụng trên các tài liệu XML cung cấp:

<pagenode title="home" url="~/" fornavbar="true"> 
    <pagenode title="admin" url="~/admin" fornavbar="false"> 
     <pagenode title="users" url="~/admin/users" fornavbar="false"/> 
     <pagenode title="events" url="~/admin/events" fornavbar="true"/> 
    </pagenode> 
    <pagenode title="catalog" url="~/catalog" fornavbar="true"/> 
    <pagenode title="contact us" url="~/contactus" fornavbar="false"/> 
</pagenode> 

các truy nã, kết quả chính xác được sản xuất:

<pagenode title="home" url="~/" fornavbar="true"> 
    <pagenode title="events" url="~/admin/events" fornavbar="true"/> 
    <pagenode title="catalog" url="~/catalog" fornavbar="true"/> 
</pagenode> 

Giải thích:

  1. Quy tắc nhận dạng (mẫu) sao chép mọi nút "as-is". Sử dụng identity rule và ghi đè nó là mẫu thiết kế XSLT cơ bản nhất.

  2. Có một mẫu duy nhất ghi đè quy tắc nhận dạng - đối với các thành phần có thuộc tính fornavbar"false". Ở đây hành động được chỉ định là áp dụng các mẫu trên các phần tử con của phần tử hiện tại.

+1

+1 Câu trả lời hay. Chỉ cần cho ngữ nghĩa và ngược lại logic của một giải pháp quy tắc duy nhất, tôi sẽ sử dụng '* [không (tự :: pagenode/@ fornavbar = 'true')]' –

+0

@Alejandro: Cảm ơn. Ý anh là gì? –

+0

Tôi có nghĩa là quy tắc bỏ qua sẽ khớp với bất kỳ phần tử nào có thuộc tính '@ fornavbar' với giá trị chuỗi' 'false'', do đó quy tắc nhận dạng sẽ khớp với ** bất kỳ phần tử nào ** không có thuộc tính '@ fornavbar' với' false ''string value, thay vì' pagenode' elements ** chỉ ** có thuộc tính '@ fornavbar' với giá trị chuỗi'' true''. –