给出文档DTD中的有效条目:
<!ATTLIST name
id CDATA #IMPLIED
attribute ENTITY #IMPLIED >
在给定属性名称和节点的情况下,如何在xslt转换期间获取属性类型?
例如name / @ id ='CDATA'
和name / @ attribute ='ENTITY'
提前致谢!
答案 0 :(得分:5)
此信息不是Xpath数据模型的一部分,并且XML解析器不会向XSLT报告(事实上,您通常无法确保解析器完全读取DTD)
如果您怀疑属性是ENTITY类型,那么您可以使用由XSLT 1添加的unparsed-entity-uri(@name)
XPath函数,如果您获得除空字符串以外的任何内容,则会有一个未解析的该名称实体(无论是否为属性被声明为ENTITY类型)
答案 1 :(得分:2)
我发现使用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变压器。
我会接受之前的upvoted答案,因为这个解决方案显然是基于xalan和xerxes的使用,但我想为后代添加这个。也许对某人有用。