Làm thế nào tôi có thể, cho một DOM w3c (thực hiện mặc định của Java, cụ thể) thay đổi không gian tên của tất cả các phần tử/thuộc tính/nút trong DOM đó? Hiệu quả, tốt nhất.
Tôi không nghĩ rằng đó là giải pháp hiệu quả cũng mạnh mẽ. Bạn không thể chỉ cần đổi tên một cái gì đó trên phần tử gốc. Hãy xem xét các tài liệu này:
Doc1
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:all" xmlns:f="urn:fleet" xmlns:m="urn:mission">
<f:starfleet>
<m:bold>
<f:ship name="Enterprise" />
</m:bold>
</f:starfleet>
</root>
Doc2
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:all">
<starfleet xmlns="urn:fleet">
<bold xmlns="urn:mission">
<ship xmlns="urn:fleet" name="Enterprise" />
</bold>
</starfleet>
</root>
Doc3
<?xml version="1.0" encoding="UTF-8"?>
<r:root xmlns:r="urn:all">
<r:starfleet xmlns:r="urn:fleet">
<r:bold xmlns:r="urn:mission">
<r:ship xmlns:r="urn:fleet" name="Enterprise" />
</r:bold>
</r:starfleet>
</r:root>
Ba tài liệu tương đương trong một DOM namespace-aware. Bạn có thể chạy cùng một số namespaced XPath queries với bất kỳ người nào trong số họ.
Vì DOM cho phép bạn chỉ định chính xác cách các nút nên được đặt tên, nên không có lệnh gọi một bước nào để thay đổi không gian tên. Bạn cần phải đi bộ DOM, xem xét không chỉ các giá trị tiền tố và URI, mà còn là scope tại bất kỳ thời điểm đã định nào.
XSLT này có thể được sử dụng với một Transformer để thay đổi các yếu tố namespaced như urn:fleet
được namespaced như urn:new
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="urn:fleet" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="f:*">
<xsl:variable name="var.foo" select="local-name()" />
<xsl:element namespace="urn:new" name="{$var.foo}">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Hãy cẩn thận: tinh chỉnh hơn nữa sẽ được yêu cầu để xử lý các thuộc tính namespaced; Dangling urn:fleet
tờ khai có thể được bỏ lại phía sau, đó là lộn xộn, nhưng phần lớn không quan trọng; có lẽ những thứ khác mà tôi chưa từng nghĩ tới.
XSL có lẽ là giải pháp đơn giản nhất, và nên làm việc trong JAXP. Bạn đã thử làm gì và nó đã thất bại như thế nào? – skaffman