XSLT从DTD获取属性的类型

时间:2013-03-08 13:02:51

标签: xslt types attributes element dtd

给出文档DTD中的有效条目:

<!ATTLIST name
               id  CDATA    #IMPLIED 
               attribute  ENTITY    #IMPLIED  >

在给定属性名称和节点的情况下,如何在xslt转换期间获取属性类型?

例如name / @ id ='CDATA'

和name / @ attribute ='ENTITY'

提前致谢!

2 个答案:

答案 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的使用,但我想为后代添加这个。也许对某人有用。