Jak mogę, zważywszy W3C DOM (Domyślna implementacja Javy, a konkretnie) zmiany nazw każdego element/atrybut/węzeł w tym DOM? Skutecznie, najlepiej.
Nie sądzę, że istnieje skuteczne rozwiązanie, które jest również solidne. Nie możesz zmienić nazwy czegoś na głównym elemencie. Następujące dokumenty:
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>
zmienna 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>
Te trzy dokumenty są równoważne w przestrzeni nazw świadomy DOM. Możesz uruchomić ten sam namespaced XPath queries przeciwko którymkolwiek z nich.
Ponieważ DOM pozwala określić dokładnie, jak węzły powinny być nazwane, nie ma żadnego catch-all, jednoetapowe wywołanie, aby zmienić obszar nazw. Musisz chodzić DOM, biorąc pod uwagę nie tylko wartości prefiksów i URI, ale ich scope w dowolnym momencie.
XSLT ta może być używana z elementami do zmiany Transformer przestrzeni nazw jak urn:fleet
do przestrzeni nazw jak 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>
Ostrzeżenia: dalsze szczypanie byłyby wymagane do obsługi przestrzeni nazw cech; zwisające deklaracje mogą pozostać w tyle, co jest nieporządne, ale w dużej mierze nieistotne; prawdopodobnie inne rzeczy, o których nie myślałem.
XSL jest chyba najprostszym rozwiązaniem i powinien działać w JAXP. Czego próbowałeś i jak mu się nie udało? – skaffman