2017-06-21 12 views
0

XML内のCData要素の下にある文字列を置き換えるにはどうすればよいですか? は、ここで私は以下のような2つの条件に合致するようにしようとしている:XML内の文字列を検索し、その終わりに1つの部分文字列が一致し、別の部分文字列を含む

<xsl:template match="@*[ends-with((local-name(),'mustEndWithThisSubstring'))] and not(contains((local-name(),'mustContainThisSubstring')))" > 

1 - 「のxsl:マッチ」のための複数の条件を持つことがどのように節を?

2(不明)にマッチした文字列を希望の文字列(既知)に置き換えるには

以下のスニペットをご覧ください。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata- 
section-elements=replacingWith"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="@*[ends-with((local-name(),'mustEndWithThisSubstring'))] and not(contains((local-name(),'mustContainThisSubstring')))" > 
    <xsl:copy> 
      <replacingWith"/> 
         <xsl:value-of select="substring-after(., '&lt;foundStringThatMatchesConditions>'), '&lt;/foundStringThatMatchesConditions>')"/> 
      </replacingWith> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

入力:

<soap:Body> 
    <pre:getResponse> 
    <![CDATA[ 
      <foundStringThatMatchesConditions> 
    ....... 
      </foundStringThatMatchesConditions> 
    ]]> 
</pre:getResponse> 
</soap:Body> 

出力:

<soap:Body> 
    <pre:getResponse> 
     <![CDATA[ 
       <replacingWith> 
     ....... 
      </replacingWith> 
     ]]> 
</pre:getResponse> 
</soap:Body> 
+2

[あなたの前の質問](https://stackoverflow.com/questions/44532804/move-an-xml-element-from-its-place-to-under-another-parent-element-using)から知っておくべきです。 -xslt)は、CDATAの内容が文字列関数以外のXPath式では対処できない無意味な文字列であることを示しています。これは、ターゲットが真のXMLツリーであってもXPath式があまり意味をなさないという点にあります。 –

答えて

1

どのように私は、XMLでのCDATA要素の下にある文字列を置き換えることができますか?

他のテキストノードの値の文字列を置き換える方法とまったく同じです。すなわち、入力文書中のCDATAセクションから得られた文字データと他の文字データとの間の構文解析の後に区別がなされない。すべては、XSLTでも使用されるXPathデータモデルのテキストノードとして表されます。実際、それらはマージの対象となるため、テキストノードには直後の兄弟として別のテキストノードがありません。 text()は、テキストノードに特に一致するノードテストです。

特にCDATAセクションの内容は、XSLTに関する限り構造がないことに注意してください。 CDATAを使用して別のXML文書にXMLを埋め込む場合、セクションの内容にXMLのように(直接的に)アクセスすることはできません。ホスト文書の目的のために、それらはそうではありません。

XSLT 1.0には、部分文字列の検索と置換のための組み込み関数はありませんが、テンプレートを使用して手間をかけずに行うことができます。 substring-before()substring-after()、およびおそらく機能を参照してください。

また、 "XSL:マッチ" のための複数の条件を持つことがどのように

1-、

を尋ねるセクションを?

複数の述語を指定したり、ブール演算子を使用して同じ述語内の条件を結合することができます。関係演算子がandある場合、例えば、

<xsl:template match="@*[ends-with(local-name(),'mustEndWithThisSubstring') and not(contains(local-name(),'mustContainThisSubstring'))]" > 

又は

<xsl:template match="@*[ends-with(local-name(),'mustEndWithThisSubstring')][not(contains(local-name(),'mustContainThisSubstring'))]" > 

は、2つの形式は、同様の、しかし同一ではない意味を持っています。ただし、これらの特定の式は、の属性@*)と一致しますが、これらはCDATAを含むこともCDATAにも含まれないことに注意してください。

2-(不明)にマッチした文字列を希望する文字列(既知)の文字列に置き換えるにはどうすればよいですか?

あなたはと照合される文字列事前でを知らないかもしれないが、あなたは確かにテキストがと照合され、関連するテンプレートのコンテキストに知っています。上記の式では、local-name()関数の戻り値です。必要に応じて、これを変数に取り込むか、パラメータとして別のテンプレートに渡すことができます。すでに述べたように、文字列置換の仕事を扱うテンプレートを書くことは可能です。詳細はエクササイズとして残しています。

関連する問題