Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在XSL中将元组转换为数字_Xml_Xslt - Fatal编程技术网

Xml 在XSL中将元组转换为数字

Xml 在XSL中将元组转换为数字,xml,xslt,Xml,Xslt,假设我有一个元组列表: <TupleList> <Tuple>1.1.1</Tuple> <Tuple>1.1.2</Tuple> <Tuple>1.1.3</Tuple> <Tuple>1.2.1</Tuple> <Tuple>1.2.2.1</Tuple> <Tuple>1.2.2.2</Tupl

假设我有一个元组列表:

<TupleList>
    <Tuple>1.1.1</Tuple>
    <Tuple>1.1.2</Tuple>
    <Tuple>1.1.3</Tuple>
    <Tuple>1.2.1</Tuple>
    <Tuple>1.2.2.1</Tuple>
    <Tuple>1.2.2.2</Tuple>
    <Tuple>1.2.2.3</Tuple>
    <Tuple>1.2.3</Tuple>
    <Tuple>1.3.1</Tuple>
    <Tuple>1.3.2</Tuple>
    <Tuple>1.3.3</Tuple>
</TupleList>
在普通编程语言中,我可能会将每个元组按“.”拆分,然后使用返回的最大数组计数来确定总大小。然后(可能)循环遍历每个元组的每个数字,将该数字乘以1000^(max-p),其中p是我在数组中的当前位置

总而言之,我有没有办法在XSL中执行类似的操作?不使用C#或任何其他嵌入式语言,因为我不知道我正在使用的工具是否会允许我使用

在直接的XSL中,甚至不使用更高级的编程语言也能做到这一点吗

和往常一样,我们非常感谢任何和所有的线索

这在直接XSL中可能吗

考虑到XSLT甚至没有内置的指数运算,这是可能的,尽管它并不十分简单。不过,您可以尝试以下方法:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="max">
    <xsl:for-each select="/TupleList/Tuple">
        <xsl:sort select="string-length(translate(., '0123456789', ''))" data-type="number" order="descending"/>
        <xsl:if test="position()=1">
            <xsl:value-of select="string-length(translate(., '0123456789', ''))"/>
        </xsl:if>
    </xsl:for-each>
</xsl:variable>

<xsl:template match="/">
    <NumberList>
        <xsl:for-each select="TupleList/Tuple">
            <xsl:call-template name="numerize">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
        </xsl:for-each>
    </NumberList>
</xsl:template>

<xsl:template name="numerize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter">.</xsl:param>
    <xsl:param name="position" select="$max"/>
    <xsl:param name="multiplier">
        <xsl:call-template name="power">
            <xsl:with-param name="base" select="1000"/>
            <xsl:with-param name="exponent" select="$position"/>
        </xsl:call-template>
    </xsl:param>
    <xsl:param name="result" select="0"/>
    <xsl:choose>
        <xsl:when test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="numerize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
                <xsl:with-param name="position" select="$position - 1"/>
                <xsl:with-param name="result" select="$result + substring-before($text, $delimiter) * $multiplier"/>
             </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <number>
                <xsl:value-of select="$result + $text * $multiplier"/>
            </number>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="power">
    <xsl:param name="base"/>
    <xsl:param name="exponent"/>
    <xsl:param name="result" select="1"/>
    <xsl:choose>
        <xsl:when test="$exponent = 0">
            <xsl:value-of select="1"/>
        </xsl:when>
        <xsl:when test="$exponent > 1">
            <xsl:call-template name="power">
            <xsl:with-param name="base" select="$base"/>
            <xsl:with-param name="exponent" select="$exponent - 1"/>
            <xsl:with-param name="result" select="$base * $result"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$base * $result"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

.
当这应用于以下测试输入时:

<TupleList>
    <Tuple>0</Tuple>
    <Tuple>1</Tuple>
    <Tuple>1.23</Tuple>
    <Tuple>1.23.456</Tuple>
    <Tuple>1.23.456.78</Tuple>
</TupleList>

0
1.
1.23
1.23.456
1.23.456.78
结果是:

<?xml version="1.0" encoding="UTF-8"?>
<NumberList>
   <number>0</number>
   <number>1000000000</number>
   <number>1023000000</number>
   <number>1023456000</number>
   <number>1023456078</number>
</NumberList>

0
1000000000
1023000000
1023456000
1023456078
--

我相信关于元组元素是0..999范围内的整数的假设是不言而喻的。

要在“纯XSL”中实现这一点,将“纯XML”作为输入是很方便的,也就是说,将每个数字放在一个单独的元素中,
的子元素中。您可以将此作为转换的第一步,但这会增加复杂性,而且可能有更直接的方法。您可以使用哪个XSLT版本?我无法控制正在使用的XML。如果我问了,我就不需要问这个问题了。我会照你的建议去做……:)XSLT呢?1.0.Wow。我印象深刻。:)我真的希望在实际实现中得到像“这不容易做到”这样的答案。非常感谢你这么做。我会在有机会的时候测试它,如果它与我的代码一起工作,我肯定会将它标记为答案。再次感谢。:)好吧,我终于有机会测试这个。。。我将此作为答案,并提出一个警告。:)在xslfidle.net上,我得到了上面的结果,在XSLTransform.net上,我得到了一个稍微偏离的答案。。。很明显,发动机不同。非常感谢您的支持。@EDanaII“在XSLTransform.net上,我得到了一个稍微有点偏离的答案……”我认为,只有在使用XSLT 2.0处理器的情况下。--“我把这个标记为答案”嗯。。。再试一次?没有。:)它在小提琴上演奏得很好。这对我来说已经足够好了。@EDanaII我是说再试一次,把这个标记为答案…:)
<?xml version="1.0" encoding="UTF-8"?>
<NumberList>
   <number>0</number>
   <number>1000000000</number>
   <number>1023000000</number>
   <number>1023456000</number>
   <number>1023456078</number>
</NumberList>