ドキュメントのDTDに有効なエントリがある場合:
<!ATTLIST name
id CDATA #IMPLIED
attribute ENTITY #IMPLIED >
属性とノードの名前を指定して、xslt変換中に属性のタイプを取得するにはどうすればよいですか?
たとえば、name / @ id ='CDATA'
およびname/@ attribute ='ENTITY'
前もって感謝します!
ドキュメントのDTDに有効なエントリがある場合:
<!ATTLIST name
id CDATA #IMPLIED
attribute ENTITY #IMPLIED >
属性とノードの名前を指定して、xslt変換中に属性のタイプを取得するにはどうすればよいですか?
たとえば、name / @ id ='CDATA'
およびname/@ attribute ='ENTITY'
前もって感謝します!
この情報はXpathデータモデルの一部ではなく、XMLパーサーによってXSLTに報告されません(実際、パーサーがDTDを読み取ることを一般的に確認することはできません)。
属性のタイプがENTITYであると思われる場合はunparsed-entity-uri(@name)
、XSLT 1によって追加されたXPath関数を使用できます。空の文字列以外のものを取得した場合は、その名前の未解析のエンティティがありました(その属性がENTITYタイプであると宣言されているかどうかは関係ありません)。 )。
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の使用に基づいているため、以前の賛成の回答を受け入れますが、将来の世代のためにこれも追加したいと思いました。多分それは誰かに役立つでしょう。