簡體   English   中英

Java XML 和 XSLT 轉換錯誤:尚未聲明前綴“m”的命名空間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM