2010-05-22 37 views
8

tôi cần phải chuyển đổi xml doc sau:XSLT: nút thay đổi bên trong văn bản

<a> 
    <b/> 
    <c/> 
    myText 
</a> 

vào đây:

<a> 
    <b/> 
    <c/> 
    differentText 
</a> 

Vì vậy, tôi đã viết tài liệu XSLT này

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" /> 

    <xsl:template match="https://stackoverflow.com/a/text()"> 
    <a> 
     <b/> 
     <c/> 
     differentText 
    </a> 
</xsl:template> 
</xsl:stylesheet> 

này cách, tôi nhận được kết quả sau:

<?xml version="1.0" encoding="utf-8"?> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 

Kết quả xuất hiện lặp lại 3 lần vì 3 kết quả trùng khớp đang được thực hiện .. Tại sao? Tôi có thể sửa nó không? Cảm ơn

+0

Câu hỏi hay (+1). Xem câu trả lời của tôi cho một giải pháp tốt hơn, đơn giản hơn, không yêu cầu bất kỳ vị từ nào trong biểu thức đối sánh của mẫu cụ thể. –

Trả lời

8

Loại trừ các nút văn bản whtespace-only. Biết và sử dụng hướng dẫn <xsl:strip-space>.

chuyển đổi này:

<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="a/text()"> 
    <xsl:text>Diferent text</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

khi áp dụng cho các tài liệu XML được cung cấp, sản xuất các kết quả chính xác muốn.

Không cần các biến vị ngữ phức tạp trong biểu thức đối sánh của mẫu cụ thể!

Chúng ta nên phấn đấu cho giải pháp đơn giản nhất, ngắn nhất, thanh lịch nhất, dễ đọc nhất, dễ hiểu nhất, sử dụng toàn bộ sức mạnh của ngôn ngữ.

Cơ hội là giải pháp như vậy sẽ được hiểu rõ nhất, dễ triển khai nhất và có khả năng được tối ưu hóa bởi bất kỳ bộ xử lý XSLT nào, dẫn đến việc triển khai hiệu quả nhất.

+0

BTW, tôi không xem xét '[normalize-space()! = '']' Một vị từ đặc biệt phức tạp. ;) – Tomalak

+0

@Tomalak: chúng ta nên phấn đấu cho giải pháp đơn giản nhất, ngắn nhất, thanh lịch nhất, dễ đọc nhất, dễ hiểu nhất, sử dụng toàn bộ sức mạnh của ngôn ngữ. Rất có thể là một giải pháp như vậy sẽ được hiểu rõ nhất, dễ thực hiện nhất và có khả năng được tối ưu hóa bởi bất kỳ bộ xử lý XSLT nào, dẫn đến việc thực hiện hiệu quả nhất. :) –

6

ba trận đấu, như được nhấn mạnh bởi các dấu ngoặc vuông:

<a>[ 
    ]<b/>[ 
    ]<c/>[ 
    myText 
]</a> 

Bạn muốn một cái gì đó như:

<xsl:template match="https://stackoverflow.com/a/text()[normalize-space() != '']"> 
+0

Như được hiển thị trong câu trả lời của tôi, không có vị từ nào là cần thiết trong biểu thức đối sánh. :) –

+4

@Dimitre: Tôi biết điều đó. Câu trả lời của tôi cung cấp sự thay đổi ít nhất có thể cho mã hiện có. Nó dựa trên giả định rằng mã thực tế phức tạp hơn và '' có thể gây ra các tác dụng phụ ở những nơi khác. – Tomalak

+0

@Tomalak: Giả sử những gì OP không nói thường làm cho giải pháp tối ưu và khó hiểu hơn, thậm chí còn khó hiểu. Đi theo cách này, chúng tôi có thể kết thúc nói với tất cả những gì chúng ta biết về XSLT - "chỉ trong trường hợp ..." :) –

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