- PR -

.NETのXSLT関数

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/02/22
投稿数: 15
投稿日時: 2005-02-22 15:37
はじめまして。

.NET FrameworkのXSLTransformでXSLT変換をしようと思うのですが、
XSLTスタイルシートの中でunparsed-entiry-uri()関数を使用していると、
以下の例外が発生します。

---
ハンドルされていない例外 : System.Xml.Xsl.XsltException: 関数 'unparsed-entity-uri()' が失敗しました。 ---> System.Xml.Xsl.XsltException: 'unparsed-entity-uri()' はサポートされていない XSLT 関数です。
---

なお、同じスタイルシートを使ってmsxsl.exeで変換する場合は、正しく変換されます。
何か、関数の使い方を間違えているのでしょうか?


---XSLT(抜粋)

<xsl:template match="test">
<xsl:value-of select="unparsed-entity-uri(@ref)"/>
</xsl:template>

---XML(抜粋)

<!DOCTYPE test [
<!ELEMENT test EMPTY>
<!ATTLIST test ref ENTITY #IMPLIED>
<!ENTITY ent SYSTEM "ent.png" NDATA png>
<!NOTATION png SYSTEM "">
]>
<test ref="ent"/>

---source(抜粋)
private static void Transform(string targetPath,
string sourcePath, string xsltPath) {
XmlResolver resolver = new XmlUrlResolver();
XPathDocument sourceDocument = new XPathDocument(sourcePath);
XslTransform xslt = new XslTransform();
xslt.Load(xsltPath, resolver);
using (StreamWriter writer = new StreamWriter(targetPath)) {
xslt.Transform(sourceDocument, null, writer, null);
}
}
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-02-26 01:05
使い方はあっています。Microsoftのバグです。

もしかしたらMicrosoftは意図的にこのバグを導入したのかもしれません。というのは、DTDの情報を残さないXPathDocumentでは、unparsed-entity-uri()をサポートすることが不可能だからです。
未記入
会議室デビュー日: 2005/02/22
投稿数: 15
投稿日時: 2005-02-28 13:11
Atsushi.Enoさん、有難うございます。

バグでしたか。
どこかに「サポートしない関数一覧」のようなものがあるのかと思い、
探し回ってしまいました。

>というのは、DTDの情報を残さないXPathDocumentでは、unparsed-entity-uri()をサポー
>トすることが不可能だからです。

id()関数は大丈夫なのになー、うーむ。。。
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-02-28 13:37
id()はDTDの情報ではありません(正確に言えば、DTDの情報とは限りません)。id()が使えるのは、XmlValidatingReaderを使えばそれがXML SchemaのID型であることが取得できるため、DTDの情報を保持しなくてもIDのリストがXPathDocument内で保持できるためです。
未記入
会議室デビュー日: 2005/02/22
投稿数: 15
投稿日時: 2005-03-01 08:57
Atsushi.Enoさん、有難うございます。

> id()が使えるのは、XmlValidatingReaderを使えばそれがXML SchemaのID型であることが取得できるため、DTDの情報を保持しなくてもIDのリストがXPathDocument内で保持できるためです。

XML Schemaについて詳しく知らないのですが、XmlValidatingReaderではID型は取得できるけど、ENTITY型は取得しない、と言うことでしょうか...?
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-03-01 11:12
いえ、そんなことはありません。

あるノードが(実際にはattributeのみが対象ですが)ID型であることを知るためには、その属性のスキーマ型さえ取得できればOKです(XmlValidatingReader.SchemaTypeで取得できます)。

unparsed-entity-uri()に必要なのは、あるノードをENTITY型であると知ること(だけ)ではなく、そのENTITYのSYSTEM識別子です。これはXmlValidatingReaderでは無理です。
未記入
会議室デビュー日: 2005/02/22
投稿数: 15
投稿日時: 2005-03-01 11:33
Atsushi.Enoさん、有難うございます。

> unparsed-entity-uri()に必要なのは、あるノードをENTITY型であると知ること(だけ)ではなく、そのENTITYのSYSTEM識別子です。これはXmlValidatingReaderでは無理です。

なるほど、つまりMSは解析対象外実体などと言う過去の遺物とは訣別させたいのではないか(恐らく)、という事ですね。
1

スキルアップ/キャリアアップ(JOB@IT)