1

私はXSLTに取り組んでいます。

ソース XML:

           <?xml version="1.0" encoding="iso-8859-1"?>
            <Content>
              <alertHeader>


                <ol xmlns="http://www.w3.org/1999/xhtml">
                  <li>
                    <strong>Review</strong>
                    your current available balance. It can be obtained 24 hours a day, 7 days a week through
                    <a href="/ALL_UNDER_123">Account Activity</a>
                    any 123 ATM or by calling
                    <a id="dynamicvariable" href="#" name="Customercare">[Customercare]</a>
                    at
                    <a id="dynamicvariable" href="#" name="contactNo">[contactNo]</a>
                    .
                  </li>
                  <li>
                    <strong>Take into consideration</strong>


                    <ul>
                      <li>Please get in touch with us</li>
                      <li>Please consider this as important info</li>
                    </ul>


                  </li>
                  <li>
                    <strong>Current</strong>
                    Statementt doesnot match the requirement
                    <a id="dynamicvariable" href="#" name="Actual acccount">[Actual acccount]</a>
                    ,plus
                    <a id="dynamicvariable" href="#" name="totalcharges">[totalcharges]</a>
                    Make u r response as positive.
                  </li>
                </ol>
                <p xmlns="http://www.w3.org/1999/xhtml"></p>
                <div xmlns="http://www.w3.org/1999/xshtml"></div>
                <span xmlns="http://www.w3.org/1999/xshtml"></span>



              </alertHeader>
            </Content>

タグ alertHeader のコンテンツ全体を値として別のテンプレートに渡す XSLT を作成したいと考えています。

このコードを次のように変更したいと思います。

                   1.Remove the tags   <p></p>, and <div></div>,<span></span> and <a></a>. I want to remove only tags but not the value of the tags. It should be there as it is.
                   2.Pass the content including tags to "Process" template.

必要な出力:

          <aaa>
            <text>

            <ol xmlns="http://www.w3.org/1999/xhtml">
              <li>
                    <strong>Review</strong>
                    your current available balance. It can be obtained 24 hours a day, 7 days a week through
                <dynamicvariable name="Customercare"/>

                at
                <dynamicvariable name="contactNo"/>

                .
              </li>
              <li>
                    <strong>Take into consideration</strong>


                    <ul>
                      <li>Please get in touch with us</li>
                      <li>Please consider this as important info</li>
                    </ul>


                  </li>
              <li>
                <strong>Current</strong>
                    Statementt doesnot match the requirement
              </li>
            </ol>
            </text>
          </aaa>

現在の XSLT:

              <?xml version="1.0" encoding="utf-8"?>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                <xsl:output method="xml" indent="yes"/>


                <xsl:template match="alertHeader">
                  <xsl:call-template name="process">

                    <xsl:with-param name="text" select="." />


                  </xsl:call-template>

                </xsl:template>
                <xsl:template name="process">
                  <xsl:param name="text" />

                  <xsl:variable name="head" select="substring-before($text, '[')" />
                  <xsl:variable name="tag" select="substring-before(substring-after($text, '['), ']')" />
                  <xsl:variable name="tail" select="substring-after($text, ']')" />

                  <xsl:choose>
                    <xsl:when test="$head != '' and $tag != ''">
                      <xsl:value-of select="$head" />
                      <dynamicVariable name="{$tag}" />
                      <!-- recursive step: process the remainder of the string -->
                      <xsl:call-template name="process">
                        <xsl:with-param name="text" select="$tail" />
                      </xsl:call-template>
                    </xsl:when>
                    <xsl:otherwise>
                      <xsl:value-of select="$text" />
                    </xsl:otherwise>
                  </xsl:choose>
                </xsl:template>

              </xsl:stylesheet>

私のコードに必要なすべての変更を誰でも言うことができますか?

ありがとう。

4

2 に答える 2

2

XML ドキュメントの初期処理を行ってからプロセステンプレートに渡す必要はありません。あなたの質問を見ると、フォーム '[Total_Fee]' などのテキスト内の 'タグ' をdynamicVariable要素に変換する必要がある (明示的に言及していない) ようです。

そのため、最初に、選択したノードを無視するテンプレートを用意する必要がありますが、それらの要素とテキストの一致は継続します。

<xsl:template match="Content|alertHeader|xhtml:p|xshtml:div|xshtml:span|xhtml:a">
  <xsl:apply-templates select="@*|node()"/>
</xsl:template>

ここで複雑なのは、いくつかのノードに異なる名前空間を定義したことです (これらは XSLT ドキュメントで宣言する必要があります)。複数の名前空間がある場合は、次のこともできます。

<xsl:template match="Content|alertHeader|*[local-name() = 'p']|*[local-name() = 'span']|*[local-name() = 'div']|*[local-name() = 'a']">

名前空間がなければ、次のことができます

<xsl:template match="Content|alertHeader|p|div|span|a">

次に、名前付きプロセステンプレートを結合して、text()要素に一致させることができます。

<xsl:template match="text()" name="process">

これにより、テキスト要素を照合し、それ自体を再帰的に呼び出してテキスト内のタグを探すことができます。

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:xhtml="http://www.w3.org/1999/xhtml" 
   xmlns:xshtml="http://www.w3.org/1999/xshtml"
   exclude-result-prefixes="xhtml xshtml">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="Content|alertHeader|xhtml:p|xshtml:div|xshtml:span|xhtml:a">
      <xsl:apply-templates select="@*|node()"/>
   </xsl:template>

   <xsl:template match="text()" name="process">
      <xsl:param name="text" select="." />

      <xsl:choose>
         <xsl:when test="contains($text, ']') and contains($text, '[')">
            <xsl:value-of select="substring-before($text, '[')"/>
            <dynamicVariable name="{substring-before(substring-after($text, '['), ']')}"/>
            <xsl:call-template name="process">
               <xsl:with-param name="text" select="substring-after($text, ']')"/>
            </xsl:call-template>
         </xsl:when>
         <xsl:otherwise>
            <xsl:value-of select="$text"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

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

XML に適用すると、以下が出力されます。

<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<strong>Review</strong>                     your current available balance. It can be obtained 24 hours a day, 7 days a week through                     Account Activity                     any Wells Fargo ATM or by calling                     <dynamicVariable name="Call_Center_Name" xmlns="" />                     at                     <dynamicVariable name="Phone_Number" xmlns="" />                     .                   </li>
<li>
<strong>Take into account</strong>
<ul>
<li>Your pending transactions and any additional transactions that have not yet been deducted from your available balance, such as checks you have written or upcoming scheduled automatic payments.</li>
<li>Any transactions that have been returned because you did not have enough money in your account at that time; they may be resubmitted for payment by the person or party who received the payment from you</li>
</ul>
</li>
<li>
<strong>Deposit</strong>                     enough money to establish and maintain a positive account balance. A deposit of at least                     <dynamicVariable name="Absolute_Available_Balance" xmlns="" />                     ,plus                     <dynamicVariable name="Total_Fee" xmlns="" />                     in fees, would have been required to make your account balance positive at the time we sent this notice.                   </li>
</ol>
于 2012-04-25T08:06:30.317 に答える
0

xslt-1.0 の問題は、テンプレートの変換結果を参照する XPath や関数などがないため、結果ノードまたはノードセットにアクセスできないことです。

そのまま呼び出すことが必須processですか?これについて私が行う方法はprocess、ちょうど 1 つのノードを変換するテンプレートを作成し、それを以下のすべてのノードから呼び出すことalertHeaderです。

<xsl:template match="alertHeader">
  <!-- switch modes so we know we need to call process -->
  <xsl:apply-templates mode="callproc"/>
</xsl:template>

<xsl:template match="*" mode="callproc">
  <!-- call process on THIS node -->
  <xsl:call-template name="process">
    <xsl:with-param name="text" select="."/>
  </xsl:call-template>
  <!-- descend -->
  <xsl:apply-templates mode="callproc"/>
</xsl:template>

<!-- all the stuff that needs stripping -->
<xsl:template match="p|div|span|a" mode="callproc">
  <!-- call process on the text() portion -->
  <xsl:call-template name="process">
    <xsl:with-param name="text" select="text()"/>
  </xsl:call-template>
  <!-- no descent here -->
</xsl:template>

更新:processテンプレート なし

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xh="http://www.w3.org/1999/xhtml"
  xmlns:xsh="http://www.w3.org/1999/xshtml">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Content">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="alertHeader">
    <xsl:element name="aaa">
      <xsl:element name="text">
        <!-- switch modes so we know we need to call process -->
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:element>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <!-- descend -->
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <!-- all the stuff that needs stripping -->
  <xsl:template match="xh:p|xh:div|xh:span|xsh:div|xsh:span">
    <xsl:apply-templates/>
  </xsl:template>

  <!-- was process -->
  <xsl:template match="xh:a[@name]">
    <xsl:element name="dynamicvariable" namespace="http://www.w3.org/1999/xhtml">
      <xsl:attribute name="name">
        <xsl:value-of select="@name"/>
      </xsl:attribute>
    </xsl:element>
  </xsl:template>

  <xsl:template match="xh:a"/>

  <xsl:template match="text()">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>

出力:

                <ol xmlns="http://www.w3.org/1999/xhtml">
            <li>
                <strong>Review</strong>
                your current available balance. It can be obtained 24 hours a day, 7 days a week through

                any Wells Fargo ATM or by calling
                <dynamicvariable name="Call_Center_Name"/>
                at
                <dynamicvariable name="Phone_Number"/>
                .
            </li>
            <li>
                <strong>Take into account</strong>


                <ul>
                    <li>Your pending transactions and any additional transactions that have not yet been deducted from your available balance, such as checks you have written or upcoming scheduled automatic payments.</li>
                    <li>Any transactions that have been returned because you did not have enough money in your account at that time; they may be resubmitted for payment by the person or party who received the payment from you</li>
                </ul>


            </li>
            <li>
                <strong>Deposit</strong>
                enough money to establish and maintain a positive account balance. A deposit of at least
                <dynamicvariable name="Absolute_Available_Balance"/>
                ,plus
                <dynamicvariable name="Total_Fee"/>
                in fees, would have been required to make your account balance positive at the time we sent this notice.
            </li>
                </ol>






    </text>
</aaa>
于 2012-04-25T07:28:38.353 に答える