2

パラメータからテキストを選択して変数に配置しようとしていますが、この変数にはプレーンテキストしかありません。

<xsl:variable name="Underline">
  <xsl:choose>
    <xsl:when test="contains($style-name, 'u')">true</xsl:when>
  </xsl:choose>
</xsl:variable>

このパラメーター ( $style-name ) の値は、 strike、em、u、strong、sub、および supのいずれか、またはそれらの組み合わせにすることができます。

$style-name: "strike em u sub"

問題は、上記のコードを使用すると、文字 u が検出されるため、subuが同じであると考えられることです。これがcontainsの性質です。

ここでいくつかの調査を行いました:

http://www.w3.org XPATH

親ではなく、テキストを含む要素のみを返す XPath

しかし、私は自分のために働くものを見つけることができません。さらに情報が必要な場合は、お知らせください。

これも XSLT 1.0 のみです。私は Visual Studio 2012 を使用していますが、エンジンが何であるかは 100% わかりません。

入力を提供できますが、それは問題の範囲外であり、単なるサブ問題です。

4

2 に答える 2

4

XSLT2.0ソリューション

トークンのシーケンスに分割し、以下を使用して比較し=ます。

<xsl:when test="tokenize($style-name,' ') = 'u')">true</xsl:when>

これにより、スペースで区切られたすべてのトークンがシーケンスに変換され、= 'u'いずれかのトークンが「u」に一致する場合に一致します。

XSLT1.1ソリューション

<xsl:template name="tokenize">
  <xsl:param name="token" />
  <xsl:param name="text"/>
  <xsl:if test="string-length($text)">
     <token><xsl:value-of select="substring-before(concat($text,$token),$token)"/></token>
     <xsl:call-template name="tokenize">
       <xsl:with-param name="text" select="substring-after($text,$token)"/>
       <xsl:with-param name="token" select="$token"/>
     </xsl:call-template>
  </xsl:if>
</xsl:template>

...

<xsl:variable name="tokens">
  <xsl:call-template name="tokenize">
     <xsl:with-param name="text" select="$style-name"/>
     <xsl:with-param name="token" select="' '"/>
  </xsl:call-template>
</xsl:variable>

<xsl:when test="$tokens/token = 'u'">true</xsl:when>

XSLT1.0ソリューション

すべての主要なXSLプロセッサ(MSXSLを含む)に含まれている拡張機能が必要です。この名前空間宣言をスタイルシートに追加します。

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

そして、@ testを変更します:

<xsl:when test="msxsl:node-set($tokens)/token = 'u'">true</xsl:when>

ESLT対応プロセッサ(Saxon、xsltproc、Xalan-J、jd.xslt、および4XSLT)の場合は、およびを使用xmlns:exsl="http://exslt.org/common"exsl:node-set()ます。Xalan-Cの場合はおよびを使用xmlns:xalan="http://xml.apache.org/xalan"xalan:nodeset()ます。

于 2012-12-20T19:12:43.460 に答える
4

これは実際にはトークン化を必要としません。次のように簡単にする必要があります。

<xsl:variable name="Underline">
  <xsl:if test="contains(concat(' ',$style-name,' '),' u ')">true</xsl:if>
</xsl:variable>

または多分もっと良い

<xsl:variable name="Underline">
  <xsl:if test="contains(concat(' ',normalize-space($style-name),' '),' u ')">true</xsl:if>
</xsl:variable>

つまり、スペースで区切られたリストがあることが保証されている場合です。

于 2012-12-20T22:35:04.277 に答える