Nếu nguồn tài liệu XML của bạn có không gian tên riêng của mình, bạn cần phải khai báo không gian tên trong stylesheet của bạn, gán cho nó một tiền tố, và sử dụng tiền tố rằng khi đề cập đến các yếu tố của nguồn XML - ví dụ:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes" />
<!-- identity transform -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- exception-->
<xsl:template match="xhtml:property/@type">
<xsl:attribute name="type">
<xsl:text>some new value</xsl:text>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Hoặc, nếu bạn thích:
...
<!-- exception-->
<xsl:template match="@type[parent::xhtml:property]">
<xsl:attribute name="type">
<xsl:text>some new value</xsl:text>
</xsl:attribute>
</xsl:template>
...
PHỤ LỤC: Trong trường hợp rất khó nơi không gian tên XML không biết trước, bạn có thể làm:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes" />
<!-- identity transform -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- exception -->
<xsl:template match="*[local-name()='property']/@type">
<xsl:attribute name="type">
<xsl:text>some new value</xsl:text>
</xsl:attribute>
</xsl:template>
Tất nhiên, nó rất khó để tưởng tượng một kịch bản mà bạn sẽ biết trước rằng tài liệu XML nguồn có chứa một phần tử có tên là "property", với một thuộc tính có tên là "type" cần thay thế - nhưng vẫn không biết namespace của tài liệu. Tôi đã thêm chủ yếu này để hiển thị cách giải pháp của riêng bạn có thể được sắp xếp hợp lý.
Nguồn
2013-12-16 04:24:52
Đối với những người muốn có một giải pháp chung: một số giá trị mới đây xsl: attribute> xsl: template> xsl: template> xsl: stylesheet> –
astonia
Giải pháp của bạn là không cần thiết và tiết lộ một phần sai. Nên có ''http: // www.'' ở đầu của không gian tên' xsl'. Ngoài ra, việc kết hợp/chọn 'node() | comment() | processing-instruction() | text()' là thừa, vì các chú thích, các lệnh xử lý và các nút văn bản được kết hợp bởi 'node()'. – Flynn1179
@ Flynn1179 Giải pháp của tôi hoạt động tốt cho mọi tình huống. Tôi không biết tại sao http: // bị thiếu sau khi sao chép/dán, đó là một sai lầm, cảm ơn bạn đã chỉ ra. Tôi chỉ đưa ra một giải pháp có thể, không phải là giải pháp hoàn hảo. Điều quan trọng nhất là giải pháp của tôi làm việc cho hầu như tất cả các tình huống mặc dù "nó không cần thiết" như bạn đã nói. Mặt khác, hầu hết các câu trả lời khác bao gồm câu trả lời "chuyên gia xslt" đã không làm việc gì cả. Nhưng họ không thừa nhận điều đó. – astonia