2009-03-23 50 views
18

Tôi cần phải sao chép từ tài liệu đầu vào sang tài liệu đầu ra tất cả các thuộc tính nhưng một.Làm cách nào để sao chép một số thuộc tính?

đầu vào của tôi là như thế này:

<mylink id="nextButton" type="next" href="javascript:;" /> 

Và tôi cần đầu ra như thế này:

<a id="nextButton" href="javascript:;" /> 

Nếu tôi sử dụng XSL sau:

<xsl:template match="mylink"> 
    <a><xsl:copy-of select="attribute::*"/></a> 
</xsl:template> 

tôi nhận được tất cả các thuộc tính sản lượng như thế này:

<a id="nextButton" type="next" href="javascript:;" /> 

Nhưng tôi muốn bỏ qua thuộc tính "loại". Tôi đã thử những điều sau đây nhưng không ai trong số họ dường như làm việc theo cách tôi cần:

<xsl:copy-of select="attribute::!type"/> 
<xsl:copy-of select="attribute::!'type'"/> 
<xsl:copy-of select="attribute::*[!type]"/> 
<xsl:copy-of select="attribute::not(type)"/> 

Làm thế nào tôi nên viết stylesheet của tôi để có được sản lượng cần thiết?

Trả lời

31

Shortest dạng:

<xsl:template match="mylink"> 
    <a><xsl:copy-of select="@*[name()!='type']"/></a> 
</xsl:template> 

dài hơn một (đó là điều đầu tiên tôi đã đưa ra, tôi rời khỏi nó để tham khảo):

<xsl:template match="mylink"> 
    <a> 
    <xsl:for-each select="@*"> 
     <xsl:if test="name() != 'type'"> 
     <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> 
     </xsl:if> 
    </xsl:for-each> 
    </a> 
</xsl:template> 
+0

Các hình thức ngắn làm việc tuyệt vời. Cảm ơn bạn! – martsraits

+0

Tôi đã sử dụng cái dài hơn để hoán đổi tên của một thuộc tính ("thay đổi' loại' thành 'lớp'"). Có phiên bản nào ngắn hơn sẽ thực hiện được điều tương tự không? –

-1

Trong XSLT 2.0:

<xsl:template match="mylink"> 
    <a><xsl:copy-of select="@* except @type"/></a> 
</xsl:template> 
Các vấn đề liên quan