2

私のxmlファイル内のすべての文字列を配列に変更する簡単な方法があるかどうか、誰かが知っているかどうか疑問に思っていましたか?

例:

//This is the string I need to change:
<string name="sample1">value1, value2, value3, value4, value5</string>
//This is the way I need it to be:
<array name="sample1">
    <item>value1</item>
    <item>value2</item>
    <item>value3</item>
    <item>value4</item>
    <item>value5</item>
</array>

私の問題は、手動で行う方法がわからないということではありません。しかし、それぞれに 25 ~ 90 の値を持つ 120 個の文字列があるため、このプロセスをより簡単にシミュレートする方法を探しています。

良い例は、画像ごとにそのプロセスをシミュレートするGIMPへのアドオンを使用して、シングルクリックで複数の画像拡張子を変換することです.

私が求めていることを理解している人は誰でも、文字列から配列にこれを行う方法を知っていますか?

4

2 に答える 2

3

この XSLT:

<?xml version="1.0" encoding="UTF-8"?>

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

<xsl:template match="/">
    <array>
        <xsl:attribute name="name">
            <xsl:value-of select="string/@name"/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </array>
</xsl:template>

<xsl:template match="string/text()" name="tokenize">
    <xsl:param name="text" select="."/>
    <xsl:param name="sep" select="','"/>
    <xsl:choose>
        <xsl:when test="not(contains($text, $sep))">
            <item>
                <xsl:value-of select="normalize-space($text)"/>
            </item>
        </xsl:when>
        <xsl:otherwise>
            <item>
                <xsl:value-of select="normalize-space(substring-before($text, $sep))"/>
            </item>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $sep)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

この XML に適用されます:

<?xml version="1.0" encoding="UTF-8"?>
<string name="sample1">value1, value2, value3, value4, value5</string>

次の出力が得られます。

<?xml version="1.0" encoding="UTF-8"?>
<array name="sample1">
<item>value1</item>
<item>value2</item>
<item>value3</item>
<item>value4</item>
<item>value5</item>
</array>

XSLT は、文字列値を調べてコンマで分割する再帰的なテンプレートを使用しています。

于 2012-08-23T06:28:03.647 に答える
1

これは、XSLT 2.0 で次のように簡単に実行できます

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

 <xsl:template match="/*">
  <array name="{@name}">
     <xsl:for-each select="tokenize(., ',\s*')">
      <item><xsl:value-of select="."/></item>
     </xsl:for-each>
    </array>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<string name="sample1">value1, value2, value3, value4, value5</string>

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

<array name="sample1">
   <item>value1</item>
   <item>value2</item>
   <item>value3</item>
   <item>value4</item>
   <item>value5</item>
</array>
于 2012-08-23T12:40:00.723 に答える