1

<p>現在使用されているXMLフィードがあり、その中にタグ付きのテキストの束を含むノードがあります。ただし、各タグの後に、問題を引き起こしているスペースがあるようです。XMLドキュメントの例を以下に示します。

<Text>
<p> Sample Text.</p> <p> Sample Text..</p> <p> Sample Text.</p> <p> Sample Text.</p> <p> Sample Text.</p>
</Text>

<p>各タグの先頭のスペースを削除して、「テキスト」ノードのデータを以下のように変換したいと思います。

<Text>
<p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>

誰かがこれを手伝ってくれませんか?

ありがとう

4

5 に答える 5

2

I.任意の数の連続するスペースの開始グループを削除する非再帰的なXSLT1.0ソリューション

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

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

 <xsl:template match="p/text()">
  <xsl:value-of select=
   "substring-after
     (.,
      substring-before
        (.,
         substring
           (translate(., ' ', ''), 1, 1)
         )
      )"/>
 </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用する場合:

<Text>
    <p> Sample Text.</p> <p> Sample Text..</p> <p> Sample Text.</p> <p> Sample Text.</p> <p> Sample Text.</p>
</Text>

必要な正しい結果が生成されます。

<Text>
    <p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>

説明

アイデアは次のとおりです。

  1. 最初の非スペース文字を取得します。

  2. この文字の前にあるスペースの文字列を取得します(1で取得)。

  3. そのスペースの文字列の直後に続く文字列を取得します(2で取得)。


II。XSLT 2.0ソリューション

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

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

 <xsl:template match="p/text()">
  <xsl:sequence select="replace(., '^\s+(.+)$', '$1')"/>
 </xsl:template>
</xsl:stylesheet>

この変換が同じXMLドキュメント(上記)に適用されると、同じ正しい結果が生成されます。

<Text>
    <p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>

注意してください

Martin Honnenは、次の使用を提案しています。

replace(., '^\s+', '')

これはより短いですが:

replace(., '^\s+(.+)$', '$1')

前者は一般に多くの個別の置換を実行しますが、後者は単一の置換を実行するため、より効率的です。

更新:OPはXSLT 2.0ソリューションを使用できませんでした、と彼は書いています:

スペースのように見えるものが実際にはタブである可能性があると今考えていますが、これを確認してから削除するにはどうすればよいですか?

解決策は次を使用することです。

replace(., '^[\s&#9;&#10;&#13;]+(.+)$', '$1')
于 2012-07-03T12:42:10.610 に答える
1

ID変換テンプレートを使用する

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

p加えて、要素の最初の子のテンプレート

<xsl:template match="p/text()[1]">
  <xsl:value-of select="substring(., 2)"/>
</xsl:template>
于 2012-07-03T09:30:42.463 に答える
0

このテンプレート:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="Text/p/text()[1]">
    <xsl:call-template name="ltrim" />
  </xsl:template>

  <xsl:template name="ltrim">
    <xsl:param name="start" select="1" />

    <xsl:choose>
      <xsl:when test="substring(., $start, 1) = ' '">
        <xsl:call-template name="ltrim">
          <xsl:with-param name="start" select="$start + 1" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="substring(., $start)" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

<p>left-タグのコンテンツの先頭にある空白のみをトリミングします。

他のすべての空白はそのままにします。XMLの場合、次のように返されます。

<Text>
<p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
于 2012-07-03T09:34:03.477 に答える
0

次のXSLTを試してください

<?xml version="1.0" encoding="UTF-8"?>
<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="node()">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>
于 2012-07-03T09:27:00.480 に答える
-1

Simple Search-Replaceユーティリティを使用する:http ://www.rjlsoftware.com/software/utility/search/

于 2012-07-03T09:19:47.400 に答える