Xslt2.0,如何识别字符串中正负数的混合
Xslt2.0, How to identify the mix of positive and negative numbers inside strings
我有一个像这样的 xml(见下文)。
使用xslt2.0,我需要找出是否有任何一个包含正数和负数的混合?
权重:positive/negative 数字的连接字符串..(分隔符 = ;)。
<PriceInfo>
<price>
<date>20160124</date>
<weights>1;2;5;4;</weights>
</price>
<price>
<date>20160125</date>
<weights>1;2;3;4;</weights>
</price>
<price>
<date>20160126</date>
<weights>1;-2;3;4;</weights>
</price>
</PriceInfo>
谢谢
嗯,用tokenize
可以把;
之间的token提取出来,然后可以判断是不是整数,如果是就转换,然后可以判断是否有更大的比和任何小于零的:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="weights">
<xsl:copy>
<xsl:variable name="integers" select="for $token in tokenize(., ';')[. castable as xs:integer] return xs:integer($token)"/>
<xsl:sequence select="(some $i in $integers satisfies $i gt 0) and (some $j in $integers satisfies $j lt 0)"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
我修改了 Martin 的答案以满足我的需要。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:variable name="allWeights" select="string-join(//weights/text(), '')" />
<xsl:variable name="weightTokens" select="for $token in tokenize($allWeights, ';')[. castable as xs:string] return xs:string($token)"/>
<xsl:variable name="isMixOfPositiveNegativeWeights" select="(some $posToken in $weightTokens satisfies matches($posToken, '[0-9].*')) and (some $negToken in $weightTokens satisfies matches($negToken, '-.*'))"/>
<xsl:value-of select="$isMixOfPositiveNegativeWeights" />
</xsl:template>
</xsl:transform>
我有一个像这样的 xml(见下文)。 使用xslt2.0,我需要找出是否有任何一个包含正数和负数的混合?
权重:positive/negative 数字的连接字符串..(分隔符 = ;)。
<PriceInfo>
<price>
<date>20160124</date>
<weights>1;2;5;4;</weights>
</price>
<price>
<date>20160125</date>
<weights>1;2;3;4;</weights>
</price>
<price>
<date>20160126</date>
<weights>1;-2;3;4;</weights>
</price>
</PriceInfo>
谢谢
嗯,用tokenize
可以把;
之间的token提取出来,然后可以判断是不是整数,如果是就转换,然后可以判断是否有更大的比和任何小于零的:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="weights">
<xsl:copy>
<xsl:variable name="integers" select="for $token in tokenize(., ';')[. castable as xs:integer] return xs:integer($token)"/>
<xsl:sequence select="(some $i in $integers satisfies $i gt 0) and (some $j in $integers satisfies $j lt 0)"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
我修改了 Martin 的答案以满足我的需要。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:variable name="allWeights" select="string-join(//weights/text(), '')" />
<xsl:variable name="weightTokens" select="for $token in tokenize($allWeights, ';')[. castable as xs:string] return xs:string($token)"/>
<xsl:variable name="isMixOfPositiveNegativeWeights" select="(some $posToken in $weightTokens satisfies matches($posToken, '[0-9].*')) and (some $negToken in $weightTokens satisfies matches($negToken, '-.*'))"/>
<xsl:value-of select="$isMixOfPositiveNegativeWeights" />
</xsl:template>
</xsl:transform>