1

XHTML 出力を生成するために XSLT ファイルで使用する次の XSLT 関数があります。

<xsl:function name="local:if-not-empty">
   <xsl:param name="prefix"/>
   <xsl:param name="str"/>
   <xsl:param name="suffix"/>
   <xsl:if test="$str != ''"><xsl:value-of select="concat($prefix, $str, $suffix)"/></xsl:if>
</xsl:function>

文字列が空でないかどうかを単純にチェックstrし、空である場合は、プレフィックスとサフィックスで連結された文字列を返します。

単純な文字列のみを渡す限り、関数は正常に機能します。しかし、HTML 要素を接頭辞または接尾辞として渡そうとすると、次のようになります。

<xsl:value-of select="local:if-not-empty('', /some/xpath/expression, '<br/>')"/>

次のエラー メッセージが表示されます。

SXXP0003: Error reported by XML parser: The value of attribute "select"
associated with an element type "null" must not contain the '<' character.

次に試したのは、変数を定義することでした。

<xsl:variable name="br"><br/></xsl:variable>

そしてそれを関数に渡します:

<xsl:value-of select="local:if-not-empty('', /some/xpath/expression, $br)"/>

ただし、ここではもちろん、要素自体がコピーされるのではなく、要素の値が抽出されるため、空の文字列が得られます。

私の最後の絶望的な試みは、変数でテキスト要素を定義することでした:

<xsl:variable name="br">
   <xsl:text disable-output-escaping="yes"><br/></xsl:text>
</xsl:variable>

これを関数に渡しますが、これも許可されていませんでした。

XTSE0010: xsl:text must not contain child elements

私はおそらく XSLT の複雑な内部動作を理解していませんが、私の意見では<br/>、ジェネリック関数を介して XSLT 変換内に要素を追加することは正当に思えます...

とにかく...誰かが私に別の解決策を教えていただければ幸いです。また、なぜこれが機能しないのかを理解したいと思います...

PS: 私は Saxon-HE 9.4.0.1J、Java バージョン 1.6.0_24 を使用しています。

4

3 に答える 3

2

の代わりにconcat、:を使用し、文字列ではなくアイテム<xsl:copy-of>をパラメータとして渡します。

   <xsl:copy-of select="$pPrefix"/>
   <xsl:copy-of select="$pStr"/>
   <xsl:copy-of select="$pSuffix"/>

完全な例を次に示します。

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:local="my:local" exclude-result-prefixes="local">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vBr"><br/></xsl:variable>

 <xsl:template match="/">
  <xsl:sequence select="local:if-not-empty('a', 'b', $vBr/*)"/>
 </xsl:template>

  <xsl:function name="local:if-not-empty">
  <xsl:param name="pPrefix"/>
  <xsl:param name="pStr"/>
  <xsl:param name="pSuffix"/>

  <xsl:if test="$pStr != ''">
   <xsl:copy-of select="$pPrefix"/>
   <xsl:copy-of select="$pStr"/>
   <xsl:copy-of select="$pSuffix"/>
  </xsl:if>
 </xsl:function>
</xsl:stylesheet>

この変換がXMLドキュメント(使用されていない)に適用されると、必要な正しい結果が生成されます。

a b<br/>
于 2012-05-22T14:30:40.023 に答える
2

Try this:

<xsl:value-of select="local:if-not-empty('', /some/xpath/expression, '&lt;br/&gt;')" disable-output-escaping="yes"/>
于 2012-05-22T14:07:12.710 に答える
0

問題は、<br/>それが文字列ではないことです。これはXML要素であるため、文字列関数を使用して操作することはできません。次のような別の関数が必要です。

<xsl:function name="local:br-if-not-empty"> 
   <xsl:param name="prefix"/> 
   <xsl:param name="str"/> 
   <xsl:if test="$str != ''">
       <xsl:value-of select="concat($prefix, $str)"/>
       <br/>
    </xsl:if> 
</xsl:function> 

または、別のケースとして扱うこのような「トリック」<br/>

<xsl:function name="local:if-not-empty"> 
   <xsl:param name="prefix"/> 
   <xsl:param name="str"/> 
   <xsl:param name="suffix"/> 
   <xsl:if test="$str != ''">
       <xsl:value-of select="concat($prefix, $str)"/>
       <xsl:choose>
          <xsl:when test="$suffix = '&lt;br/&gt;'>
             <br/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$suffix"/>
          </xsl:otherwise>
       </xsl:choose>
    </xsl:if> 
</xsl:function> 
于 2012-05-22T14:20:06.037 に答える