8

このJavaプログラムは、ブール値を出力文字列にマップする場合にTernaryを使用します(trueの場合は「*」、falseの場合は空の文字列)。

public class ternary {
  public static void main(String[] args) {
    boolean flags[]={true,false,true};
    for (boolean f : flags) {
      System.out.println(f?"*":"");
    }
  }
}

したがって、出力は*、[空]、*です。

次のような入力XMLドキュメントがあります。

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="change.xsl"?>
<root>
  <change flag="true"/>
  <change flag="false"/>
  <change flag="true"/>
</root>

そして、trueを'*'に、falseを''にマップする次のXSLTテンプレートがあります(動作します)。

<xsl:template match="change">
  <xsl:variable name="flag" select="translate(substring(@flag,1,1),'tf','*')"/>
  <xsl:value-of select="$flag"/>
</xsl:template>

これのより簡潔なバージョンはありますか?

a)文字列'true |false'から直接ブールtrue|falseの値を自動的に取得できますか?b)ブール値true |falseを'*'、''にマップするための(xpath?)構文はありますか?

4

2 に答える 2

8

a)文字列'true |false'から直接ブールtrue|falseの値を自動的に取得できますか?

b)ブール値true |falseを'*'、''にマップするための(xpath?)構文はありますか?

これは実際にはXPathの質問です。

I. XPath 1.0

複数のXPath式があり、その評価によって目的の結果が生成されます。

substring('*', 2 -(@flag = 'true'))

これもb)に答えます-文字列 はブール値'true'ではないことに注意してください!'false'ブール値はとでtrue()ありfalse()、文字列ではありません。

上記の式では、XPath 1.0でブール値が数値が必要なコンテキストにある場合、自動的に数値に変換されるという事実を使用しています。定義により:

number(true())1

number(false())0

substring()したがって、上記の呼び出しの2番目の引数は次のとおりです。

2 - (@flag = 'true')

1それ以外の場合@flag = 'true'と同様に評価され2ます。

である場合に文字列を生成し、である場合$s1$val文字列を生成する、より一般的なXPath1.0式"x"$s2$val"y"

concat(substring($s1, 1 div ($val = "x")),
       substring($s2, 1 div ($val = "y"))
      )

これにより、文字列$s1when $val = "x"、文字列$s2when $val = "y"、および空の文字列が生成されます。これらの2つの条件のいずれも当てはまらない場合。

上記のXPath1.0式を一般化して、N個の異なる文字列結果を生成でき$s1ます。 これは、関数が任意の数の引数を持つことができるため、が値の1つである場合$2$sN正確になります。$val$v1$v2$vNconcat()


II。XPath 2.0(XSLT 2.0)

'*'[current()/@flag = 'true']

そして、より一般的には、2 * Nのアトミック値、、 ...および、、 ...、、が与えられ$s1$s2すべて$sN$v1$v2$vN異なる$vi場合、このXPath2.0式を評価した結果は次のようになります。

 ($s1, $s2, ..., $sN)[index-of(($v1, $v2, ..., $vN), $v)]

$sKまさにその時です$v eq $vK

于 2012-01-12T13:35:44.710 に答える
1

このために、テンプレートで単純なパターンマッチングを利用できます。

<xsl:template match="change[@flag = 'true']">

<xsl:template match="change">

したがって、最初の1つは真のエントリに一致し、もう1つは他のすべてのケースに一致します(あなたの場合は偽です)

したがって、次のスタイルシートが与えられます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" indent="yes"/>

   <xsl:template match="change[@flag = 'true']">
      <xsl:text>*&#13;</xsl:text>
   </xsl:template>

   <xsl:template match="change">
      <xsl:text>&#13;</xsl:text>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:apply-templates select="@*|node()"/>
   </xsl:template>
</xsl:stylesheet>

サンプルXMLに適用すると、次のように出力されます。

*

*
于 2012-01-12T10:20:54.000 に答える