2

JSF1.2 に基づく何千もの JSP ファイルがありますが、代わりに JSF2.0 に移行して facelets を使用したいので、いくつかの定義されたルールに基づいて構造を変更する必要があります。たとえば、必要な変更のいくつかは次のとおりです。 :

  • <view>タグ外せばいいのに
  • に変換する必要<head>があります<h:head>
  • に変換する必要<body>があります<h:body>
  • 名前空間の宣言をいくつか変更する必要があります

膨大な数のファイルがあるため、このプロセスを自動化するミニアプリケーションを開発することにしました。そうしないと、多くのファイルを手動で変更する必要があります!!

そうするための最良の解決策は何だろうと思っていましたか?XSLT を使用する必要がありますか、それとも JSP ファイルを XML ファイルとして解析し、DOM を介してその構造を変更する必要がありますか?

4

3 に答える 3

1

これらは単純なテキスト置換ではありません (ファイルに新しい名前空間を追加する必要があります。つまり、compositionFacelets の名前空間、ファイル拡張子が .JSP から .XHTML に変更されるなど)、より簡単なオプションは XSLT のようです。その中である種のロジックを使用することはできますが、Facelets を実際に使用するために必要な変更は、自動化されたプロセスにとって簡単な作業ではありません。

これを実現するために最先端の JSF 移行プログラムを作成するのにあまり時間を無駄にしないでください。最小限の労力でほとんどすべての変更を行うことができる何かを試してから、手動で変更を行ってすべてを機能させてください。Facelets の機能をテンプレート化および複合コンポーネントとして使用する場合は、コードを手動で再構築することになります。

于 2012-09-01T10:46:56.380 に答える
0

これはXSLTでは簡単です。

必要なすべての置換を実行する例を次に示します

このソースXMLファイルを考えると

<html xmlns:old="old:namespace">
 <head>
  <meta property="og:type" content="webcontent"/>
 </head>
 <view>Some View</view>
 <body>
   The Body here.
 </body>
</html>

この変換は、要求されたすべての変更を実行します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:h="some:h" xmlns:old="old:namespace" xmlns:new="new:new"
 exclude-result-prefixes="h new old">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vnsH" select="document('')/*/namespace::h"/>
 <xsl:variable name="vnsNew" select="document('')/*/namespace::new"/>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:copy-of select="namespace::*[not(name()='old')]"/>
   <xsl:if test="namespace::old">
     <xsl:copy-of select="$vnsNew"/>
   </xsl:if>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
    <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>

 <xsl:template match="node()[not(self::*)]">
     <xsl:copy/>
 </xsl:template>

 <xsl:template match="view"/>

 <xsl:template match="/*">
  <xsl:element name="{name()}">
   <xsl:copy-of select="namespace::*[not(name()='old')]|$vnsH"/>
   <xsl:if test="namespace::old">
     <xsl:copy-of select="$vnsNew"/>
   </xsl:if>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="head|body">
  <xsl:element name="h:{name()}" namespace="some:h">
    <xsl:copy-of select="namespace::*[not(name()='old')]"/>
    <xsl:if test="namespace::old">
     <xsl:copy-of select="$vnsNew"/>
    </xsl:if>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

上記のXMLドキュメントに適用すると、必要な正しい結果が生成されます。

<html xmlns:h="some:h" xmlns:new="new:new">
   <h:head>
      <meta property="og:type" content="webcontent"/>
   </h:head>
   <h:body>
   The Body here.
 </h:body>
</html>

注意してください

  1. <view>削除されました。

  2. <head>および<body>に変換され<h:head>ます<h:body>

  3. これoldで、名前空間が名前空間に置き換えられましたnew

于 2012-09-01T16:32:51.023 に答える
0

私の賭けはDOMでしょう。ドキュメントを操作して、新しいファイルとして保存 (または上書き) します。これは、すべてのドキュメントに再帰的に適用できるルールのほんの一部です。

于 2012-09-01T10:52:27.917 に答える