0

こんにちは、XML で以下の行があり、番号のハイパーリンクも必要です。この出力を HTML 形式で表示したい。

<main>
<alph>a b 2,3</alph>
</main>

次のような出力を与える XSLT が必要です。

a b 2, a b 3

以下の XSLT を試しました。

<xsl:template match="alph">
  <xsl:variable name="link" select="normalize-space(translate(
    normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/>
  <xsl:value-of select="substring-before(normalize-space(.),$link)"/>
  <xsl:variable name="tex">
    <xsl:value-of select="text()"/>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="contains($link,',')">
      <xsl:variable name="new">
        <xsl:value-of select="tokenize($link,',')"/>
      </xsl:variable>
      <xsl:value-of select="concat($new,$tex)"/>
    </xsl:when>
    <xsl:when test="contains($link,'-')">
      <xsl:value-of select="tokenize($link,'-')"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$link"/>
    </xsl:otherwise>
  </xsl:choose>

しかし、それは私に次のような出力を与えています:

a b 2 3a b 2,3

ありがとう

4

1 に答える 1

1

あなたが持っている1つの問題は、変数リンクにあります

<xsl:variable name="link" select="normalize-space(translate(
     normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/>

文字列からすべてのアルファベット文字を削除しようとしているように見えるので、2,3だけが残ります。ただし、これが機能するには、abc...xyzをアポストロフィで囲む必要があります。そうしないと、abc...xyzという名前の要素が検索されます。そうは言っても、あなたは XSLT2.0 を使用していると言うので、ここで正規表現をパラメーターとして受け取るreplace関数を利用できます。

<xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/>

次に、このリンクの前のテキストを取得できます。

<xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/>

これにより、あなたの腹筋が得られます

最後に、tokenize関数を使用して2,3を分割できます。XSLT ではハイフンも探しているようですが、tokenize 関数も正規表現を使用しているため、これは問題ではありません。できることは、文字列をトークン化し、テキスト変数をセパレータとして使用して再結合することです

  <xsl:value-of select="concat($text, ' ')"/>
  <xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/>

ここに完全な XSLT があります

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>
   <xsl:template match="alph">
      <xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/>
      <xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/>
      <xsl:value-of select="concat($text, ' ')"/>
      <xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/>
   </xsl:template>
</xsl:stylesheet>

XML に適用すると、以下が出力されます。

a b 2, a b 3
于 2013-02-25T23:08:24.313 に答える