1

この質問は、XSLT に精通した作成者にとってはおそらく簡単に答えることができます。

次の XML ドキュメントの例があります。

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student num="12345678">
        <name>Dona Diller</name>
        <dob>1970-07-21</dob>
        <education>BSc</education>
        <education>MSc</education>
        <status>Married</status>
    </student>

<!-- more student elements to follow... -->

</students>

そして、次の XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="html"/>

    <xsl:template match="/">
        <html>
            <title>Test</title>
            <body>
                <h1>Personal details</h1>
                <xsl:apply-templates select="students/student"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="student">
        <p>
            Student number:
            <xsl:value-of select="@num"/>
        </p>
        <p>Full name:
            <xsl:value-of select="name"/>
        </p>
        <p>Date of birth
            <xsl:value-of select="dob"/>
        </p>
        <!-- TODO: text of 'education' elements must be separated by a space -->
        <p>Degrees:
            <xsl:apply-templates select="education"/>
        </p>
        <p>Status:
            <xsl:value-of select="status"/>
        </p>
    </xsl:template>

</xsl:stylesheet>

この投稿の冒頭に含まれている XML ドキュメントに適用すると、次の XHTML 出力が生成されます。

<html>
   <title>Test</title>
   <body>
      <h1>Personal details</h1>
      <p>
         Student number:
         12345678
      </p>
      <p>Full name:
         Dona Diller
      </p>
      <p>Date of birth
         1970-07-21
      </p>
      <p>Degrees:
         BScMSc
      </p>
      <p>Status:
         Married
      </p>
   </body>
</html>

私の問題は、学位名が 1 つの文字列 (教育要素のテキスト) としてマージされることです。したがって、出力で「BScMSc」を取得する代わりに、前の例で「BSc MSc」を表示したいと思います。何かご意見は?

4

4 に答える 4

4

Novatchev と Honnen による解決策はどちらも (もちろん) うまくいきますが、私には少し物足りなさを感じます。教育要素の書式設定をテンプレート ルールに委譲する場合、そのテンプレート ルールは 1 つの教育要素の書式設定のみに関係するべきであり、一連の隣接する要素の書式設定には関係しないはずです。私にとって、インタースティシャルの間隔は適切に親テンプレートの役割です。だから私は書く傾向があると思います:

<xsl:for-each select="education">
  <xsl:if test="position() ne 1"><xsl:text> </xsl:text></xsl:if>
  <xsl:apply-templates select="."/>
</xsl:for-each>

しかし、それは意見の問題です。

于 2012-04-29T20:36:44.773 に答える
2

テンプレートを追加する

<xsl:template match="education">
  <xsl:if test="position() > 1">
    <xsl:text> </xsl:text>
  </xsl:if>
  <xsl:value-of select="."/>
</xsl:template>
于 2012-04-29T16:38:08.830 に答える
1

より短く、よりシンプルに、より読みやすく

このテンプレートを追加:

<xsl:template match="education[position() > 1]">
  <xsl:value-of select="concat(' ', .)"/>
</xsl:template>
于 2012-04-29T16:59:34.480 に答える
0

各学位の末尾にスペースを追加するだけです:

<xsl:template match="education">
    <xsl:value-of select="concat(.,' ')"/>
</xsl:template>

はい、これにより次数のリストの最後に余分なスペースができますが、この場合は問題ありません。

XSLT 2.0 を使用している場合は、試すことができます

<p>Degrees:
    <xsl:value-of select="string-join(education,' ')"/>
</p>
于 2012-04-30T03:55:53.693 に答える