特に、ダッシュ ('-') で始まる値を持つ「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 を使用しています。
よろしくお願いいたします。