3

次の抽出例を含むXMLドキュメントがあります。

<p>
    Some text <GlossaryTermRef href="123">term 1</GlossaryTermRef><GlossaryTermRef href="345">term 2</GlossaryTermRef>.
</p>

XSLTを使用して、次のテンプレートを使用してこれをXHTMLに変換しています。

<xsl:template match="GlossaryTermRef">
    <a href="#{@href}" class="glossary">
        <xsl:apply-templates select="node()|text()"/>
    </a>
</xsl:template>

これは非常にうまく機能しますが、2つのGlossaryTermRef要素が隣り合って表示される場合は、2つの要素の間にスペースを挿入する必要がありますか?

現在のノードと次の兄弟の間にスペースまたはテキストがあるかどうかを検出する方法はありますか?GlossaryTermRefスペースアイテムの後に句読点が続く場合があるため、常にスペースアイテムを挿入できるとは限りません。

4

3 に答える 3

3

私はこれを自分で解決し、テンプレートを次のように変更しました。

<xsl:template match="GlossaryTermRef">
    <a href="#{@href}" class="glossary">
        <xsl:apply-templates select="node()|text()"/>
    </a>
    <xsl:if test="following-sibling::node()[1][self::GlossaryTermRef]">
        <xsl:text> </xsl:text>
    </xsl:if>
</xsl:template>

誰かがより良い方法を提案したり、このソリューションの問題を見つけたりできますか?

于 2012-04-16T19:12:06.743 に答える
2

まず、「node()| text()」は「node()」に相当するものです。おそらく、「* | node()」を意味し、要素とテキストの子を選択しますが、コメントやPIは選択しません。

あなたの解決策はおそらく他のものと同じくらい良いでしょう。もう1つは、グループ化を使用することです。

<xsl:for-each-group select="node()" group-adjacent="boolean(self::GlossaryTermRef)">
  <xsl:choose>
    <xsl:when test="current-grouping-key()">
      <xsl:for-each select="current-group()">
        <xsl:if test="position() gt 1"><xsl:text> </xsl:text></xsl:if>
        <xsl:apply-templates select="."/>
      </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
     <xsl:apply-templates select="current-group()"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each-group>

いや、それはまったくきれいではありません。

私の次の試みは兄弟再帰を使用することです(親が最初の子に適用テンプレートを適用し、各子が直後の兄弟に適用テンプレートを適用します)が、それも改善になるとは思いません。

于 2012-04-16T21:56:40.280 に答える
0

これはどうですか?あなたは何を感じる?

<xsl:template match="GlossaryTermRef">
<a href="#{@href}" class="glossary">
<xsl:apply-templates select="node()|text()"/>
</a>
</xsl:template>
于 2013-08-23T12:23:23.427 に答える