0

次のxmlがあるとしましょう。

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

出力のスキーマを無視して、出力にAを「注意」(イライラから1レベル上)、Bを「満足」(注意から1レベル上)として表示し、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があります。これらがxmlファイルの元の値ではなくWillOpenBordersAtとWillTradeTechAtである場合、ガイドはより読みやすくなるため、最終出力の値を少しずつ上げる必要があります。

議論されている追加の変換があります:

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の形式にする必要があります。これらの値もかなりの数あります。

また、0から10まで変化する「GoodieBaddie」のような変換があります。これを次のようなものに変換したいと思います。

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 に答える