2

私はw3schools.comでxpath軸について読んでいて、ヘルプを検索しようとしていますが、実際に何を検索するかを理解するのに苦労しています。

さまざまなxmlファイルをpdfプリントに変換するために使用されるxslスタイルシートがあります。私が立ち往生している部分は、いくつかのフォーマットを変更する必要があるときに、少なくとも3つの異なるシナリオを特定したことです。2つのケースでフォーマットを変更する方法を見つけましたが、3つ目は、他の2つのハイブリッドの一種であり、1つだけが必要なときに、両方のフォーマットのセットを表示し続けます。

追加情報があれば教えてください、ありがとうございます!

シナリオ1:

<TASK>
    <REVST>Some revised text
</TASK>

シナリオ2:

<LIST>
  <PARA>
    <REVST />Some Text <REVEND />
  </PARA>
</LIST>

シナリオ3:

<TASK>
   <PARA>
      <REVST />Some other revised text <REVEND />
   </PARA>
 </TASK>

シナリオ1で機能するように見える<xsl:if test="parent::*TASK/REVST">のは、for-eachを実行し、各「ITEM」を通過するスタイルシートの一部にこれを含めることです。シナリオ2で機能すると思われるのは、このテスト<xsl:if test="descendant::REVST">をPARAテンプレート内に配置することです。

しかし、シナリオ3の場合、PARAテンプレートからのフォーマットのみである必要があるのに、両方が表示されることになります。

助言がありますか?または、検索用語の提案でさえありますか?どんな助けでも大歓迎です:)

学ぶべきことがたくさんあることは知っています。提供されたヘルプに感謝しますが、リビジョンの書式設定(ページの右側にあるバー)を表示しないようにする方法がまだよくわかりません。一部のテキストのみが改訂されることが示されている場合、ドキュメント全体に対して?

<LIST>
<PARA>
    <REVST/>
    THIS IS SOME TEXT THAT SHOULD BE MARKED BY A REVISION BAR.
    <REVEND/>
</PARA>
</LIST>

このような場合、基本的にドキュメント全体のリビジョンバーを表示する必要があります。

<TASK>
  <ELE1/>
    <REVST/>
    <ELE2/>
    <TITLE>The Title</TITLE>
    <ELE3>
      <ELE4>
        <TITLE>General</TITLE>
        <LIST>
          <LITEM>
            <PARA>This is some paragraph text.</PARA>
          </LITEM>
        </LIST>
      </ELE4>
    </ELE3>
</TASK>

提示されたもので試してみましたが、テキストまたはPARA部分で*を追加しないと当てはまらないようでした。私はおそらくそこにも何かが欠けています。

<xsl:template match="TASK/*text()[preceding-sibling::*[1][self::REVST] and following-sibling::*[1][self::REVEND]]">
    <fo:block color="red" border-right="solid black 2pt" margin-right="16pt">
        <xsl:apply-templates />
    </fo:block>
</xsl:template>
<xsl:template match="LIST1/*PARA/text()[preceding-sibling::*[1][self::REVST] and following-sibling::*[1][self::REVEND]]">
    <fo:block color="green" border-right="solid black 2pt" margin-right="16pt">
        <xsl:apply-templates />
    </fo:block>
</xsl:template>

追加のアドバイスはありますか?私はまだ立ち往生しています:(

4

3 に答える 3

2

私はw3schools.comでxpath軸について読んでいます

それは良い学習戦略ではありません。w3schoolsは、かつて知っていたが忘れてしまったことを調べるのに非常に便利ですが、基本的な概念を理解するのに役立つように構成されていません。良い本を手に入れてください。

あなたの投稿は、あなたが文脈の重要な概念を理解していないことを私に示唆しています。XPath式の意味は、評価される時点でのコンテキストノードの状態に大きく依存します。あなたが文脈を理解していれば、これらの表現が使用された文脈が何であるかを私たちに教えてくれたと思います。

于 2012-08-07T05:41:40.480 に答える
1

これを行う方法は次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match=
 "TASK/text()[preceding-sibling::*[1][self::REVST]
            and
              following-sibling::*[1][self::REVEND]
              ]">

  Processing Type1 of: "<xsl:value-of select="."/>"
 </xsl:template>

 <xsl:template match=
 "LIST/PARA/text()[preceding-sibling::*[1][self::REVST]
                 and
                   following-sibling::*[1][self::REVEND]
                   ]">

  Processing Type2 of: "<xsl:value-of select="."/>"
 </xsl:template>

 <xsl:template match=
 "TASK/PARA/text()[preceding-sibling::*[1][self::REVST]
                 and
                   following-sibling::*[1][self::REVEND]
                   ]">

  Processing Type3 of: "<xsl:value-of select="."/>"
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合:

<t>
 <TASK> <REVST/>Some revised text<REVEND/> </TASK>
 <LIST> <PARA> <REVST />Some other revisedext <REVEND /> </PARA> </LIST>
 <TASK> <PARA> <REVST />Some yet other revised text <REVEND /> </PARA> </TASK>
</t>

必要な結果(それぞれのケースが独自の方法で処理されます)が生成されます。

  Processing Type1 of: "Some revised text"


  Processing Type2 of: "Some other revisedext "


  Processing Type3 of: "Some yet other revised text "

覚えておくべきルール

XSLTを...XSLTとして使用します。

つまり、常にインラインよりもテンプレートを優先しますxsl:for-each。前者の結果、コードは短く、シンプルで、エラーが発生しにくく、クリーンで、理解しやすく、保守しやすくなります。後者の場合、エラーが発生しやすく、理解しにくく、拡張や保守が難しい、より長く、より複雑で、醜い、スパゲッティのようなコードになります。

于 2012-08-07T02:40:57.180 に答える
0

毎回フルパスを使ってみませんか:

/TASK/REVST
/LIST/PARA
/TASK/PARA/REVST
于 2012-08-06T22:20:17.187 に答える