質問
状況:
私は単純な XML 画像情報を含む文書。に変換する必要があります HTML. 。ただし、開いたタグがどこにあるのか、いつ使用するのかがわかりません。 XSL 以下のコードを実行すると、次のエラー メッセージが表示されます。
「要素開始タグが開いていない場合、属性ノードを書き込むことはできません。」
XML コンテンツ:
<root>
<HeaderText>
<HeaderText>Dan Testing</HeaderText>
</HeaderText>
<Image>
<img width="100" height="100" alt="FPO lady" src="/uploadedImages/temp_photo_small.jpg"/>
</Image>
<BodyText>
<p>This is a test of the body text<br /></p>
</BodyText>
<ShowLinkArrow>false</ShowLinkArrow>
</root>
XSLコード:
<xsl:stylesheet version="1.0" extension-element-prefixes="msxsl"
exclude-result-prefixes="msxsl js dl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:js="urn:custom-javascript" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:dl="urn:datalist">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes" encoding="utf-8"/>
<xsl:template match="/" xml:space="preserve">
<img>
<xsl:attribute name="width">
100
</xsl:attribute>
<xsl:attribute name="height">
100
</xsl:attribute>
<xsl:attribute name="class">
CalloutRightPhoto
</xsl:attribute>
<xsl:attribute name="src">
<xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>
</img>
</xsl:template>
</xsl:stylesheet>
解決
ここで問題を明確にするために、エラーは次のコード部分にあります。
<xsl:attribute name="src">
<xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>
命令 xsl:copy-of は、ノードまたはノードセットを受け取り、そのコピーを作成し、ノードまたはノードセットを出力します。ただし、属性にはノードを含めることはできず、テキスト値のみを含めることができるため、xsl:value-of が解決策として考えられます (これはノードまたはノードセットのテキスト値を返すため)。
はるかに短い (そしておそらくより洗練された) 解決策は次のとおりです。
<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/>
属性での {} の使用は属性値テンプレートと呼ばれ、任意の XPATH 式を含めることができます。
属性値テンプレートで使用されるときにテキスト値を取得することがわかっているため、xsl_copy-of で使用したのと同じ XPath をここで使用できることに注意してください。
他のヒント
そうあるべきではないでしょうか:
<xsl:value-of select="/root/Image/img/@src"/>
?Image/img ノード全体を @src 属性にコピーしようとしているようです
属性を追加するには、XSL が必要とします
<xsl:element name="img"> (attributes) </xsl:element>
ただの代わりに
<img> (attributes) </img>
ただし、要素をそのままコピーするだけの場合は、その必要はありません。
気にしないでください -- 私は馬鹿です。ただ必要だった <xsl:value-of select="/root/Image/node()"/>
試すもう 1 つのオプションは簡単です
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
つまり{} を使用せず、代わりに直接画像パスを指定します