2

このソース ドキュメントを考えると:

<things>
  <thing><duck>Eider</duck></thing>
  <thing><duck>Mallard</duck></thing>
  <thing><duck>Muscovy</duck></thing>
</things>

次の出力が必要です

Fat Eider, Fat Mallard, Fat Muscovy

この XSL 変換で実際に取得できます。

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" >
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:value-of separator=", ">
      <xsl:apply-templates select="//duck"/>
    </xsl:value-of>
  </xsl:template>
  <xsl:template match="duck" as="xs:string">
    <xsl:value-of select="concat('Fat ', .)"/>
  </xsl:template>
</xsl:stylesheet>

ただし、次の 3 つの質問があります。

質問 1. (具体的)

ダック テンプレートから削除するas="xs:string"と、次の出力が得られます。

    Fat EiderFat MallardFat Muscovy 

なんで?私の理解では、XSLT 2.0 では結果xsl:apply-templatesは常にシーケンスであり、シーケンス内の項目の間にxsl:value-of挿入されます。では、テンプレートに属性separatorがない場合、シーケンスが「崩壊」しているように見えるのはなぜでしょうか? asMichael Kay の優れた本の「XSLT 2.0 and XPath 2.0, 4th Edition」の適切なページを教えてくれたボーナス ポイント。

質問 2. (あいまいです!)

XSLT の初心者ユーザーとして、この問題を解決する方法はおそらくたくさんあると思います。別のアプローチを取る良い解決策を提案できますか? どのようにアプローチを選択しますか?

質問3。

デバッグ。asへの属性の有無の違いを示す中間結果をダンプする方法をお勧めできますtemplateか?

4

1 に答える 1