0

可以说我有以下xml。

<root>
  <data>
    <a>ATTITUDE_ANNOYED</a>
    <b>ATTITUDE_CAUTIOUS</b>
    <c>25</c>
    <d>30</d>
  </data>
</root>

忽略我的输出模式,我希望我的输出将 A 呈现为“谨慎”(比恼火高一级),B 呈现为“高兴”(比谨慎高一级),我想对 C 和 D 执行一些数学运算将值转换为稍微不同的东西。

我在这里看过一堆类似的问题(而且我是 XSLT 的新手,所以也许我不太明白)但是很多解决方案似乎是“在线”的,即您修改转换它的结果。这没关系,但在我的真实示例中,有很多这些值,我不想在多个位置(DRY)执行完全相同的转换。我只想在开始转换之前或多或少地预处理整个文档并将一堆值转换为其他值(仅使用几个公式)。

实现这一目标的最佳方法是什么?我对性能不是特别感兴趣,所以有没有一种方法可以运行先前的转换以轻松转换特定值而不修改结构?

更新:(DevNull 询问我的输出需求)输出并未完全确定。我正在尝试帮助 CivFanatics 的一个小组制作一份指南,说明其值源自 xml 文件的 AI 之间的差异。有大量的领导者和大量的价值观需要转换,目前每个领导者需要花费 2 个小时,最终的格式还没有决定,所以我想我们都可以通过使用类似的东西来节省时间XLST。

这是我正在处理的演示的粗略示例。

<xsl:template match="data"> 
  <h3>Attitude Thresholds</h3>
  <table border="1">
    <tr><td>Will open borders</td><td><xsl:value-of select="a"/></td></tr>
    <tr><td>Will trade techs</td><td><xsl:value-of select="b"/></td></tr>
  </table>
</xsl:template>

澄清 A 和 B 是 OpenBordersRefuseAttitudeThreshold 和 TechRefuseAttitudeThreshold。如果这些是 WillOpenBordersAt 和 WillTradeTechAt 而不是 xml 文件中的原始值,则该指南更具可读性,因此我需要将它们微调为最终输出的值。

还讨论了其他转换:

iWonderConstructRand -> Builds Wonders

0 -> 0/10
5 -> 1/10
10 -> 2/10
15 -> 3/10
20 -> 4/10
25 -> 5/10
30 -> 6/10
35 -> 7/10
40 -> 8/10
45 -> 9/10
50 -> 10/10

这就是诸如 C 或 D 之类的值。它们的范围在 0-50 之间,为了便于阅读,应该将它们放入 0-10 格式。这些值也有很多。

还有像“GoodieBaddie”这样的转换,从 0 到 10 不等。我们希望将其转换为:

0-3  -> Bad(x)
4-6  -> Neutral(x)
7-10 -> Good(x)

其中 (x) 是原始值。我是否在这里使用了正确的工具来完成这项工作,还是处于临界状态?我认为 XLST 将是一个不错的选择,它可以让其他贡献者不必依赖开发人员来更改格式/布局(因为 xlst 比 C# 或 Python 更容易编辑)。

4

1 回答 1

1

这种转变

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:attitudes>
   <a val="1">ANNOYED</a>
   <a val="2">CAUTIOUS</a>
   <a val="3">PLEASED</a>
 </my:attitudes>

 <xsl:variable name="vAttitudes" select="document('')/*/my:attitudes/*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[starts-with(., 'ATTITUDE_')]/text()">
  <xsl:variable name="vVal" select=
  "$vAttitudes[. = substring-after(current(), '_')]/@val"/>

  <xsl:value-of select="concat('ATTITUDE_', $vAttitudes[@val = $vVal+1])"/>
 </xsl:template>

 <xsl:template match="*[floor(.) = .]/text()">
  <xsl:value-of select="concat(round(. div 5), '/10')"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<root>
    <data>
        <a>ATTITUDE_ANNOYED</a>
        <b>ATTITUDE_CAUTIOUS</b>
        <c>25</c>
        <d>30</d>
    </data>
</root>

产生想要的正确结果:

<root>
   <data>
      <a>ATTITUDE_CAUTIOUS</a>
      <b>ATTITUDE_PLEASED</b>
      <c>5/10</c>
      <d>6/10</d>
   </data>
</root>
于 2012-07-18T05:07:46.083 回答