1

これは、私が抱えていた以前の問題にており、皆さんは1日以内に解決しました。

私はデジタルビデオカメラによって生成されたXMLファイルを扱っています。このカメラを使用すると、ユーザーはカメラのすべての設定をSDカードに保存できるため、設定を呼び出したり、別のカメラに読み込んだりできます。私が書いているXSLスタイルシートを使用すると、ユーザーはWebブラウザーでSDカードに保存されたカメラの設定を表示できます。

XMLファイルのほとんどの値(私のスタイルシートでフォーマットされている)は人間にとって意味がありますが、意味がないものもあります。私がやりたいのは、XMLファイルの値に基づいているが、人間がより理解しやすいスタイルシートのテキストを表示することです。

XMLファイルに書き込むことができる一般的な値は、カメラのフレームレートを表す「_23_970」です。これは、23.970(または023.970)として表示する方が適切です。最初のアンダースコアは、099.999を超える値用のスペースを作成するための一種のプレースホルダーです。2番目のアンダースコアは、明らかに小数を表します。

私の以前の(同様の)質問には、予測可能なテキストの置き換えが含まれ、解決策はテンプレートのマッチングでした。ただし、この場合、カメラは119,999フレームレートのいずれかに設定できます(私はその計算を正しく行ったと思います)。

アプローチは、表示されたWebページに値を渡し、数値(各桁)を保持し、2番目のアンダースコアを小数に置き換え、最初のアンダースコアをnbspまたはゼロ(どちらか簡単な方)に置き換えることです。 )。文字列の最初の文字が「1」の場合(カメラは最大120.000のフレームレートで実行できます)、スタイルシートに表示されているページに文字を渡す必要があります。

ワイルドカードに関する他の投稿をここで読みましたが、この質問に答える投稿が見つかりませんでした。

編集:重要な情報を省略して申し訳ありません。質問をする最初の試みで、私はうまくいきました!私は満足したと思います。とにかく。。。

XSLファイルのテキストをそのまま表示するコードを表示する必要があります。

<tr>
  <xsl:for-each select="Settings/Groups/Recording">
    <tr><td class="title_column">Frame Rate</td><td><xsl:value-of select="RecOutLinkSpeed"/></td></tr>
   </xsl:for-each>
</tr>

また、使用しているサンプルファイルのURLを提供する必要があります:http://josephthomas.info/Alexa/Setup_120511_140322.xml

4

2 に答える 2

3

これらの値を持つ要素に名前が付けられていると仮定するとframe-rate、次のようにテンプレートを使用して2つのケースを処理します。

<xsl:template match="frame-rate[starts-with(., '_')]">
  <xsl:value-of select="concat('&#160;', translate(substring(., 2), '_', '.'))"/>
</xsl:template>

<xsl:template match="frame-rate[not(starts-with(., '_'))]">
  <xsl:value-of select="translate(., '_', '.')"/>
</xsl:template>
于 2012-06-22T17:31:09.620 に答える
1

使用

concat(translate(substring(.,1,1), '_', '&#xA0;'),
       translate(substring(.,2), '_', '.')
      )

これが完全な変換です。

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
 <xsl:template match=
  "td[preceding-sibling::*[1][self::td and . = 'Frame Rate']]/text()">
  <xsl:value-of select=
   "concat(translate(substring(.,1,1), '_', '&#xA0;'),
           translate(substring(.,2), '_', '.')
          )
   "/>
 </xsl:template>
</xsl:stylesheet>

trこの変換が、提供されたリンクで示されている実際のXMLドキュメントから1つの実際の要素(および2番目のケースをテストするために追加された要素)を含む単純なXMLドキュメントに適用される場合:

<t>
    <tr>
        <td class="title_column">Frame Rate</td>
        <td>_23_976</td>
    </tr>
    <tr>
        <td class="title_column">Frame Rate</td>
        <td>118_235</td>
    </tr>
</t>

必要な正しい結果が生成されます。

<t>
   <tr>
      <td class="title_column">Frame Rate</td>
      <td> 23.976</td>
   </tr>
   <tr>
      <td class="title_column">Frame Rate</td>
      <td>118.235</td>
   </tr>
</t>

説明

表現:

concat(translate(substring(.,1,1), '_', '&#xA0;'),
       translate(substring(.,2), '_', '.')
      )

次のように評価されます。

  1. 関数の2つの引数は、concat()別々に(互いに独立して)評価されます。

  2. concat()名前が意味することを実行します-2つの文字列引数を1つの文字列に連結します。

  3. このtranslate()関数は、この式で2回参照されます。これは、 `concat()の各引数を生成するために使用されます。

  4. の最初の呼び出しtranslate()は次のとおりtranslate(substring(.,1,1), '_', '&#xA0;')です。この場合、関数に渡される最初の引数は、現在のノードの文字列値の先頭文字です(XPathでは、現在の(またはコンテキスト)ノードはで示されます.)。この先頭の文字は、関数呼び出しによって生成されます。これは、オフセット1で始まり、長さが1の部分文字列substring(.,1,1)を取ります。この呼び出しの2番目の引数は、置換または削除するすべての文字を含む文字列です。この場合はただ1文字。の3番目の引数は、2番目の引数の対応する(位置による)文字を置き換える「置換文字」の文字列です。この場合、3番目の引数には単一の文字が含まれますtranslate()"_"translate()'&#xA0;'(nbsp)、これは、関数の呼び出しが、アンダースコアである場合translate()に、現在のノードの文字列値の最初の文字をnbspに置き換えることを意味します。

  5. の2番目の呼び出しはtranslate()、最初の呼び出しと同様ですtranslate(substring(.,2), '_', '.')。ただし、現在のノードの文字列値の残りの部分(位置2から開始)に適用され、この残りの部分のアンダースコアはドット文字に置き換えられます。

更新

OPは、このソリューションを自分のコードに合わせる方法を理解するのが難しいためです。これが私の推測です(彼のソースXMLドキュメントは、提供されたリンクで示されているものではなく、実際のXMLドキュメントが何であるかを推測することはできません):

<tr>
    <xsl:for-each select="Settings/Groups/Recording">
        <tr>
            <td class="title_column">Frame Rate</td>
            <td>
          <xsl:value-of select=
           "concat(translate(substring(RecOutLinkSpeed,1,1), '_', '&#xA0;'),
                   translate(substring(RecOutLinkSpeed,2), '_', '.')
                  )
           "/>
            </td>
        </tr>
    </xsl:for-each>
</tr>
于 2012-06-23T01:47:55.210 に答える