【问题标题】:Multiply <xsl:value-of> result by -1将 <xsl:value-of> 结果乘以 -1
【发布时间】:2014-10-30 23:03:13
【问题描述】:

这里是 XSL 新手/初学者用户。

我的 XSLT 文档中有类似以下模板的内容:

<xsl:template name="getpoint"> <xsl:param name="nodenum"/> <xsl:value-of select="//nodeCoord[nodeNumber=$nodenum]/nodeXCoord"/> <xsl:text>,</xsl:text> <xsl:value-of select="//nodeCoord[nodeNumber=$nodenum]/nodeYCoord"/> </xsl:template>

完整的 XSLT 文档用于生成 SVG 图形。但是,我希望将浏览器的 Y 坐标系倒置,因为我的源数据采用传统坐标系。

我的问题很简单:如何将nodeYCoord 乘以-1 并将结果而不是&lt;xsl:value-of&gt; 元素产生的值发送到浏览器?

编辑:请不要提供有关如何翻转 Y 坐标系的替代方法。我对此进行了研究,对于我的具体应用,我很确定这是最好的方法(假设我可以让它工作)。

【问题讨论】:

    标签: xml xslt xpath svg


    【解决方案1】:

    我的问题很简单:如何将 nodeYCoord 乘以 -1 和 将该结果发送到浏览器,而不是生成的值 &lt;xsl:value-of&gt; 元素?

    答案也很简单:使用减号。而不是:

    <xsl:value-of select="//nodeCoord[nodeNumber=$nodenum]/nodeYCoord"/>
    

    写:

    <xsl:value-of select="-//nodeCoord[nodeNumber=$nodenum]/nodeYCoord"/>
    

    请不要提供有关如何翻转 Y 的替代方法 坐标系。我对此进行了研究,并针对我的具体情况 应用程序我很确定这是最好的方法 (假设我可以让它工作)。

    也许你应该再看看它。

    【讨论】:

    • 添加负号是我尝试的第一件事。它在 Internet Explorer 中不起作用。图像在没有负片的情况下完美呈现,但当我添加它时根本不呈现。这些文件存储在本地,因此我无法在 Chrome 中进行转换,因为它不允许本地 XSL 转换。我很想听听您翻转 Y 的替代想法。不过,我尝试了大约 5 种不同的方法,但在这种情况下它们都不起作用。
    • michael:我在本地主机上设置了 IIS,这在 chrome 中可以工作!多谢。但是,它需要 FOREVER 才能渲染 - 比 Internet Explorer 长得多。不过总比没有好。
    • @RickTeachey 1. 我不明白为什么这不能普遍适用,但以防万一,&lt;xsl:value-of select="//nodeCoord[nodeNumber=$nodenum]/nodeYCoord * -1"/&gt; 应该做同样的事情。 2. 这与速度无关。但是使用// 可能有:在XSLT 中,明确并写出完整路径是值得的。 3. 不确定“这种情况”是什么。看看这是否有帮助:stackoverflow.com/questions/25108217/using-xslt-to-create-svg/…
    • 替代的 XPath 公式在 IE 中也不起作用。在 Chrome 中工作。 ???诡异的。感谢您提供有关更快路径的提示,我会尝试并查看链接。
    • @RickTeachey 我建议你单独测试这个问题。在此处查看使用输入和样式表时得到的结果:xsltransform.net/6qVRKvQ
    【解决方案2】:

    将值保存到变量中,然后在 xpath 表达式中使用它

    <xsl:variable name="yval" select="//nodeCoord[nodeNumber=$nodenum]/nodeYCoord/text()"/>
    <xsl:value-of select="-1 * $yval"/>
    

    【讨论】:

    • 太棒了!不知道你能做到这一点。非常感谢。
    • 快速提问:这个变量可以“重用”吗?我将做同样的任务数千次。
    • 您可以在整个模板中重新引用变量或使用表达式构造新变量。在 XSLT 中,您不能将值重新分配给变量。
    • 不幸的是,这对我来说可能不起作用。那么$yval 变量是全局变量吗?它不只是当前模板的本地,并且一旦模板的迭代完成就不会“刷新”?有没有办法解决这个问题?
    • 您不能在模板的执行中重新分配它。再次调用模板时,可以为其分配一个新变量。如果您需要一个全局变量,您可以在模板定义之前的样式表顶部指定它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多