8

次のセットのノード内のすべてのテキストを取得し、(複数のノードではなく)1つの値として返すようにしています。

<p>
   "I love eating out."
   <br>
   <br>
   "This is my favorite restaurant."
   <br>
   "I will definitely be back"
</p>

'/ p'を使用してすべての結果を取得していますが、改行が返されます。また、「/ p / text()」を試行すると、各タグ間の各テキストが個別の戻り値として取得されます。理想的なリターンは-

"I love eating out. This is my favorite restaurant. I will definitely be back"

他の質問を検索してみましたが、近いものが見つかりませんでした。現在の環境では、XPathクエリのみを使用するように制限されており、HTMLの事前解析の後に解析したりセットアップしたりすることはできません。具体的には、GoogleDocs内でimportXML関数を使用しています。

4

1 に答える 1

10

使用

normalize-space(/)

このXPath式が評価されると、ドキュメントノード(/)の文字列値が最初に生成され、これが標準のXPath関数への引数として提供されますnormalize-space()

定義によりnormalize-space()、先頭と末尾の隣接する空白文字を削除し、そのような隣接する空白文字の中間のグループを1つのスペース文字に置き換えて引数を返します。

上記のXPath式を評価すると、次のようになります。

「外食が大好きです。」「これは私のお気に入りのレストランです。」「私は間違いなく戻ってきます」

引用符を削除するために、次のtranslate()関数を追加で使用します。

normalize-space(translate(/,'&quot;', ''))

この式を評価した結果は次のとおりです。

I love eating out. This is my favorite restaurant. I will definitely be back

最後に、この結果を引用符で囲むには、次のconcat()関数を使用します。

concat('&quot;',
       normalize-space(translate(/,'&quot;', '')),
       '&quot;'
       )

このXPath式を評価すると、まさに目的の結果が得られます。

"I love eating out. This is my favorite restaurant. I will definitely be back"

XSLTベースの検証

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

 <xsl:template match="/">
  <xsl:value-of select=
   "concat('&quot;',
           normalize-space(translate(/,'&quot;', '')),
           '&quot;'
           )"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合(整形式になるように修正されます):

<p>
       "I love eating out."
       <br />
       <br />
       "This is my favorite restaurant."
       <br />
       "I will definitely be back"
</p>

XPath式が評価され、この評価の結果が出力にコピーされます。

"I love eating out. This is my favorite restaurant. I will definitely be back"
于 2012-06-13T03:19:05.920 に答える