我发现使用 Xerxes 和 Xalan 可以非常简单地解决这个问题。
首先扩展样式表标签如下:
<xsl:stylesheet xmlns:java="http://xml.apache.org/xalan/java" ....
在属性处理模板上:
<xsl:template match="@*" mode="fix-entity-references">
<xsl:param name="is-entity" select="java:com.ovitas.aton.xslt.Util.isEntity(current())"/>
引用类的代码:
import org.apache.xerces.dom.DeferredAttrImpl;
import org.apache.xml.dtm.ref.DTMNodeIterator;
public class Util {
public static boolean isEntity(Object o) {
try {
DTMNodeIterator iter = ((DTMNodeIterator) o);
DeferredAttrImpl attrImpl = (DeferredAttrImpl) iter.getRoot();
return attrImpl.getTypeName().equals("ENTITY");
} catch (ClassCastException e) {
e.printStackTrace();
return false;
}
}
}
自然引用的 jar 必须添加到类路径中。
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
上面的代码可以使用 xalan 转换器。
我会接受上一个赞成的答案,因为这个解决方案显然是基于 xalan 和 xerxes 的使用,但我也想为后代添加这个。也许它对某人有用。