【问题标题】:Picking random urls from an XML从 XML 中选择随机 URL
【发布时间】:2011-09-12 12:59:42
【问题描述】:

需要一点帮助。我有一个带有城市列表和图像网址的 XML。 XML 上可以有任意数量的城市,但是我想在 XSLT 页面上有一个部分,如果我只显示一些图像(假设 XML 中的 x 个城市中有 4 个)。我希望能够通过随机选择具有附加属性 url 的任何城市来动态地执行此操作(因此每次加载页面时都会显示 4 个不同的城市图像)。这是我的 XML 示例。

<Cities>
    <City Name="London" url="LinkToImage" />
    <City Name="Aberdeen" url="LinkToImage" />
    <City Name="Birmingham" url="LinkToImage" />
    <City Name="Bristol" url="LinkToImage" />
    <City Name="Cardiff" url="LinkToImage" />
    <City Name="Edinburgh" url="LinkToImage" />
    <City Name="Glasgow" url="LinkToImage" />
    <City Name="Liverpool" url="LinkToImage" />
    <City Name="Manchester" url="LinkToImage" />
    <City Name="Newcastle" url="LinkToImage" />
    <City Name="Paris" url="LinkToImage" />
    <City Name="Marseille" url="LinkToImage" />
...

如果我添加另一个属性,例如 number="x",会有帮助吗?如果可能的话 id 链接来避免这种情况。任何帮助将非常感激。

我不确定我是否可以在 XSLT 中做到这一点,或者我是否必须编写一个 JavaScript 函数......无论哪种方式,我都不确定如何解决它。我不知道一旦我在城市中循环如何让它随机。

【问题讨论】:

  • XSLT 中没有任何随机函数。当然你可以编写(或使用现有的)一个,但你最好从结果中选择一个随机元素,或者将一个随机数作为参数传递给样式表以使用。
  • @Flynn1179 - 感谢您的想法
  • @Flynn1179:请尽量准确一点:没有任何标准 XSLT 或XPath 函数可用于生成随机数。 FXSL 差不多 10 年前就提供了这样的功能/模板。
  • @Dimitre:这就是为什么我说 in XSLT,而不是 for XSLT。鉴于我还提到了使用现有函数的可能性,应该很清楚我指的是标准 XSLT。
  • @Flynn1179:不清楚,请记住,大多数 SO 读者都不是(而且确实不是)以英语为母语的人。跨度>

标签: javascript xml xslt


【解决方案1】:

这是一个从字符串中执行此操作的完整示例。要获取该字符串(例如从文件中),您可以使用XMLHttpRequestresponseXML 属性。

var doc = 
    '<Cities>' +
    '<City Name="London" url="LinkToImage" />' +
    '<City Name="Aberdeen" url="LinkToImage" />' +
    '<City Name="Birmingham" url="LinkToImage" />' +
    '<City Name="Bristol" url="LinkToImage" />' +
    '<City Name="Cardiff" url="LinkToImage" />' +
    '<City Name="Edinburgh" url="LinkToImage" />' +
    '<City Name="Glasgow" url="LinkToImage" />' +
    '<City Name="Liverpool" url="LinkToImage" />' +
    '<City Name="Manchester" url="LinkToImage" />' +
    '<City Name="Newcastle" url="LinkToImage" />' +
    '<City Name="Paris" url="LinkToImage" />' +
    '<City Name="Marseille" url="LinkToImage" />' +
    '</Cities>';

var parser = new DOMParser();
var xml = parser.parseFromString(doc, "text/xml"); //Convert the text to XML object

var cities = xml.getElementsByTagName("Cities")[0].childNodes; //Get all child of Cities
var randomCity = Math.floor(Math.random() * cities.length); //Pick one at random
var city = cities[randomCity]; //Get it using it's index
alert(city.getAttribute("Name")); //Show it's name

http://jsfiddle.net/Xeon06/f8Ugn/

【讨论】:

  • 如果这解决了您的问题,请考虑通过单击左侧的绿色复选标记接受我的回答作为您问题的解决方案。
【解决方案2】:
【解决方案3】:

可以在纯 XSLT(1.0 或 2.0)中创建伪随机数序列。

请参阅我的作品“用 FXSL 掷骰子:XSLT 中的随机数生成函数here

当然,如果您不想在每次转换时生成相同的数字序列,则需要将每次都不同的参数作为参数传递给转换 - 例如,这可能是当前时间(以分钟为单位)。

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多