2016-09-02 4 views
0

属性値の変更と要素XSLの部分文字列の置換を達成したいと考えています。XSL:文字列を置換して属性値を変更する方法

XML

<...> 
    <communication type="telephone">123 456 789 </communication> 
    <communication type="telephone">789 (EXT)</communication> 
    <communication type="telephone">123 456 789 </communication> 
</...> 

<...> 
    <communication type="telephone">123 456 789 </communication> 
    <communication type="ext">789</communication> 
    <communication type="telephone">123 456 789 </communication> 
</...> 

XSL(2.0)

<xsl:template match="communication[@type='telephone'][contains(text(),'(EXT)')]"> 
<xsl:copy> 
    <xsl:value-of select="replace(., '(EXT)', '')"/> 
    <xsl:attribute name="extension">true</xsl:attribute> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 

Saxxonは、属性ノードは、レコード生成することはできません「 を述べなければなりません包含要素の子の後に編集しました "

私は属性タイプの値を変更することはできませんでしたので、私は新しい属性を作成しました。しかし、この回避策でも、私は両方の要件(属性を追加し、部分文字列を削除する)をどのようにして動作させるか考えていません。

これを解決するアイデアは高く評価されています。

+0

あなたのタイトルは「*変化属性値*」と言うと、あなたの出力は、 'type'がの値を変更することを示してい「電話」から「内線」への属性。しかし、あなたのコードは新しい 'extension'属性を追加しています。どちらが正しい? –

+0

申し訳ありません。私は同じ値を持つ別の属性 "拡張"を追加するつもりだった。 – user1491184

答えて

0

私はあなたがこの部分

<xsl:template match="communication[@type = 'telephone' and contains(., '(EXT)')]"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:attribute name="extension">true</xsl:attribute> 
    <xsl:value-of select="replace(., '(EXT)', '')"/> 
    </xsl:copy> 
</xsl:template> 
1

をしたいと思う:

<xsl:value-of select="replace(., '(EXT)', '')"/> 

communicationの子であるテキストノードを作成します。これを済ませたら、もはやcommunicationの属性を作成することはできません。

<xsl:attribute name="extension">true</xsl:attribute> 

と::

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

@*)一部あなたはそれをしようとする2つの命令を持っています。

xsl:attribute命令が最初に来なければなりません。すべてのコンテンツを既に自分で作成しているので、実際にはここでxsl:apply-templates命令を使用することは望ましくありません。

replace()はかっこを置き換えないことにも注意してください。

もちろん

、あなただけ実行することにより、すべてがはるかに簡単にできます。

<xsl:template match="communication[@type='telephone'][contains(text(),'(EXT)')]"> 
    <communication extension="true"> 
     <xsl:value-of select="replace(., '\(EXT\)', '')"/> 
    </communication> 
</xsl:template> 
関連する問題