2

ドキュメントのDTDに有効なエントリがある場合:

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

属性とノードの名前を指定して、xslt変換中に属性のタイプを取得するにはどうすればよいですか?

たとえば、name / @ id ='CDATA'

およびname/@ attribute ='ENTITY'

前もって感謝します!

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 に答える