0

我想找到一个“更好”的解决方案来获取属性的最小值和最大值并将它们保存到可访问的变量中。我也很想摆脱 for-each-loop。这怎么可能?

我的 XML:

<Rows>
  <Entry value1="16,423" value2="18,123" />
  <Entry value1="423" value2="11,588" />
  <Entry value1="1,168" value2="521" />
</Rows>

还有我的 XSL:

<xsl:for-each select="Rows/Entry/@value1|Rows/Entry/@value2">
  <xsl:sort select="." data-type="number" />
  <xsl:choose>
    <xsl:when test="position() = 1">
      <xsl:variable name="min" select="format-number(translate(.,',',''),'#')" />
    </xsl:when>
    <xsl:when test="position() = last()">
      <xsl:variable name="max" select="format-number(translate(.,',',''),'#')" />
    </xsl:when>
  </xsl:choose>
</xsl:for-each>

所需的输出应该是 $min=423 和 $max=18123 作为数字并且可以在 for-each-loop 之外访问

4

2 回答 2

2

好吧,自 2007 年以来就有 XSLT 2.0(由 Saxon 9、AltovaXML、XmlPrime 等 XSLT 处理器实现),您可以在其中简单地做(假设您的元素xmlns:xs="http://www.w3.org/2001/XMLSchema"上有声明):xsl:stylesheet

<xsl:variable name="min" select="min(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', ''))"/>
<xsl:variable name="max" select="max(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', ''))"/>

如果您真的想将格式化的字符串存储在变量中,您当然也可以使用例如

<xsl:variable name="min" select="format-number(min(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', '')), '#')"/>
<xsl:variable name="max" select="format-number(max(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', '')), '#')"/>

至于 XSLT 1.0,我认为排序for-each是正确的方法,但你需要拉xsl:variable外部for-each例如

<xsl:variable name="min">
 <xsl:for-each select="Rows/Entry/@value1|Rows/Entry/@value2">
  <xsl:sort select="translate(., ',', '')" data-type="number"/>
  <xsl:if test="position() = 1">
    <xsl:value-of select="format-number(., '#')"/>
  </xsl:if>
 </xsl:for-each>
</xsl:variable>

<xsl:variable name="max">
  <xsl:for-each select="Rows/Entry/@value1|Rows/Entry/@value2">
   <xsl:sort select="translate(., ',', '')" data-type="number"/>
   <xsl:if test="position() = last()">
      <xsl:value-of select="format-number(.,'#')" />
   </xsl:if>
  </xsl:for-each>
</xsl:variable>

作为替代方案,您可以替换为for-eachapply-templates然后编写模板匹配@value1 | @value2,但是虽然我认为大多数转换节点的任务最好使用 XSLT 中的推送样式完成,但我认为找到最小值或最大值for-each很好。

于 2013-06-27T09:40:12.867 回答
1

我不确定这是否绝对正确,但我试了几分钟

(/Rows/Entry/@value1|/Rows/Entry/@value2)[not((/Rows/Entry/@value1|/Rows/Entry/@value2) &lt; .)]

这对于最大值

(/Rows/Entry/@value1|/Rows/Entry/@value2)[not((/Rows/Entry/@value1|/Rows/Entry/@value2) &gt; .)]

它给了我你提到的价值观。但为了简化起见,我使用没有“,”的值的 xml。

于 2013-06-27T09:27:35.000 回答