0

特に、ダッシュ ('-') で始まる値を持つ「name」属性を持つ特定の要素を見つける XSLT を作成しています。そのような属性が見つかると、xslt は xsl:attribute を作成します。この名前は、「name」属性のダッシュの後に来るすべてのテキストです。

たとえば、次の XML セグメントがあるとします。

<someelement>
    <json:string name="-style">display: block; white-space: pre; border: 2px     
                       solid #c77; padding: 0 1em 0 1em; margin: 1em; 
                        background-color: #fdd; color: black</json:string>
                     [... some extra elements here ...]
</someelement>

そして、私はそれがなりたい

<someelement style="display: block; white-space: pre; border: 2px solid #c77; 
                   padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; 
                   color: black">
                 [... some extra elements here ...]
</someelement>

現在、次の XSLT でいくつかのバリエーションを試しています。

  <!-- Match string|number|boolean|null elements with a "name" attribute -->
  <xsl:template match="json:string[@name] | json:number[@name] | json:boolean[@name] | json:null[@name]">
    <xsl:choose>
      <xsl:when test="starts-with(@name,'-')">
        <xsl:attribute name="{substring(./[@name],2,string-length(./@name) - 1)}">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="{@name}">
          <xsl:value-of select="."/>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

具体的に言うと、これは私を困惑させる行です:

<xsl:attribute name="{substring(./[@name],2,string-length(./@name) - 1)}">

さらに具体的に言えば、動作しない部分は文字列の長さの部分です。文字列の長さの部分全体を数値、たとえば 2 に置き換えると、問題なく動作します。

はい、substring-after の方が適していることはわかっています。次のことを試しましたが、どちらも機能しません。

<xsl:attribute name="{substring-after(./[@name],'-')}">

これはある種の構文エラーであると確信しています。

PS - テストには XMLSPY を使用しています。

よろしくお願いいたします。

4

1 に答える 1