[英]Java XML transformer error on attribute : Namespace for prefix 'req' has not been declared
[英]Java XML and XSLT transformation error: Namespace for prefix 'm' has not been declared
我正在嘗試使用 javax.xml.transform.Transformer 和 XSLT 轉換 XML 文檔,並且在調用轉換方法時無法識別命名空間前綴時遇到問題。
這是其中定義了“m”命名空間前綴的 XML 文檔:
<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="SITUATION">
</Schema>
</edmx:DataServices>
</edmx:Edmx>
這是目前僅復制整個 XML 文檔的 XSL(稍后我想擴展它以合並另一個 XML 文檔,類似於此處描述的內容: https : //stackoverflow.com/a/5706319/208011 ):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Copy everything including attributes as default action -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
這是Java代碼:
Source xsltSource = new StreamSource(new File(getClass().getClassLoader().getResource("merge-metadata.xsl").getFile()));
transformer = transFact.newTransformer(xsltSource);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document input = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(s1)));
StringWriter out = new StringWriter();
transformer.transform(new DOMSource(input), new StreamResult(out));
這是堆棧跟蹤:
Caused by: java.lang.RuntimeException: Namespace for prefix 'm' has not been declared.
at com.sun.org.apache.xml.internal.serializer.SerializerBase.getNamespaceURI(SerializerBase.java:915)
at com.sun.org.apache.xml.internal.serializer.SerializerBase.addAttribute(SerializerBase.java:431)
at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.addAttribute(ToUnknownStream.java:316)
最終我想將這個 XML 文檔與另一個合並,但我無法解決命名空間問題而只復制這個文檔。
如果我不在轉換器工廠 newTransformer() 方法中使用 xsl 樣式表,那么我不會收到命名空間錯誤,並且轉換的輸出與原始 XML 文檔完全相同。
如果我將 DocumentBuilderFactory 設置為不感知命名空間,那么我不會收到異常,但轉換的輸出缺少命名空間。
謝謝你的幫助。
您手工制作的偽標識轉換正在丟失命名空間聲明,並且在嘗試使用未聲明的命名空間前綴命名元素時失敗:
<xsl:element name="{name()}">
改用標准身份轉換:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.