2

私はこのxmlファイルを持っています:

 <pas>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>DOUBLE</type>
    <oper>HIGH</oper>
    <val1>103619.9</val1>
    <bId>2</bId>
  </rulepar>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <sumval1>-103.67</sumval1>
    <bId>3</bId>
  </rulepar>
 </pas><rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val1>10</val1>
    <bId>3</bId>
  </rulepar>
 </pas>

この xsl ファイルで:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" xml:space="preserve"/>

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

<xsl:template match="val1|sumval1">  
    <val111><xsl:value-of select="."/></val111>
</xsl:template>

変換を行うと、結果として次のようになります。

 <pas>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>DOUBLE</type>
    <oper>HIGH</oper>
    <val111>103619.9</val111>
    <bId>2</bId>
  </rulepar>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>-103.67</val111>
    <bId>3</bId>
  </rulepar>
 </pas><rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>10</val111>
    <bId>3</bId>
  </rulepar>
 </pas>

私は通常、この出力を期待していました:

 <pas>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>DOUBLE</type>
    <oper>HIGH</oper>
    <val111>103619</val111>
    <bId>2</bId>
  </rulepar>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>-103</val111>
    <bId>3</bId>
  </rulepar>
 </pas><rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>10</val111>
    <bId>3</bId>
  </rulepar>
 </pas>

では、予想される出力ファイルに示されているように、結果で数値 103619.9 の整数部分のみを取得するにはどうすればよいでしょうか? 数値が 10 進数のみで、この数値が <0 の場合でも、歩けるソリューションが必要です。ご協力いただきありがとうございます。

4

3 に答える 3

5

この XPath 1.0 式は、数値が正か負かに関係なく、数値の整数部分を取得します

floor(.)*(. >= 0)    +   ceiling(.) * not(. >= 0)

説明:

  1. 数値が正の場合、floor()関数を使用します。

  2. 数値が負の場合は、ceiling()関数を使用します。

  3. という事実を使用して、2 つの関数 (上記) を結合しnumber(true()) = 1ますnumber(false()) = 0

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="text()">
  <xsl:value-of select="floor(.)*(. >= 0) + ceiling(.) * not(. >= 0)"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用された場合:

<t>
 <a>2.34</a>
 <b>-3.14</b>
</t>

必要な正しい結果が生成されます。

2
-3
于 2012-10-18T13:35:52.360 に答える
2

XPathfloor()関数は

10 進数を評価し、10 進数以下の最大の整数を返します

値がすべて正で、XPath が次のようになる場合に機能します。

<value111><xsl:value-of select="floor(number(.))"/></value111>

ただし、値が-2.1たとえばの場合、上記のコードの結果は-3.

値が負になる可能性がある場合、substring-before()関数を使用すると、小数点が 1 つしかない場合、正と負の両方の数値に対して機能します。

<value111><xsl:value-of select="substring-before(., '.')"/></value111>

注: 質問にタイプミスがあるかどうかはわかりませんが、テンプレートの 1 つの一致パターンが正しくありません。そのはず

<xsl:template match="val1|sumval1">

それ以外の

<xsl:template match="value1|sumval1"> 
于 2012-10-18T13:01:24.673 に答える
1

これを試して

<value111><xsl:value-of select="floor(number(.))"/></value111>
于 2012-10-18T13:15:15.730 に答える