2

Given a valid entry in the DTD of a document:

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

How can I get the type of an attribute during xslt transformation, given the name of the attribute and the node?

For example name/@id = 'CDATA'

and name/@attribute = 'ENTITY'

Thanks in advance!

4

2 回答 2

5

此信息不是 Xpath 数据模型的一部分,并且 XML 解析器不会将其报告给 XSLT(实际上您通常不能确定解析器是否读取 DTD)

如果您怀疑某个属性是 ENTITY 类型,那么您可以使用unparsed-entity-uri(@name)XSLT 1 添加的 XPath 函数,如果您得到的不是空字符串,则存在该名称的未解析实体(无论该属性是否被声明为 ENTITY 类型)

于 2013-03-08T15:10:46.740 回答
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 转换器。

我会接受上一个赞成的答案,因为这个解决方案显然是基于 xalan 和 xerxes 的使用,但我也想为后代添加这个。也许它对某人有用。

于 2013-03-19T11:45:03.080 回答