2013-07-26 113 views
2

我試圖將文本添加到空/自我關閉標記。XSLT:將文本添加到XML中的自動關閉標記

我想就像 「<空/ >」 改造成的東西 「<空> 一些文本 < /空>」。

這是我的xml的縮短版我工作:

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
<attr tag="00080090" vr="PN" pos="-1" name="Referring Physician's Name" vm="0" len="0"/> 
</dataset> 

我想得到這樣的結果:

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
<attr tag="00080090" vr="PN" pos="-1" name="Referring Physician's Name" vm="0" len="0">this is the inserted text</attr> 
</dataset> 

而是我最終未修改XML。如果沒有該標籤的文本,似乎我的匹配不起作用。如果已經有一些文本,它會起作用,它取代了這種情況下的文本,這對我來說很好。

我的XSL(T)是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="no"/> 

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

<xsl:template match="attr[@tag='00080090']/text()"> 
    <xsl:text>this is the inserted text</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

我做我的http://xslttest.appspot.com

任何提示測試?

+0

不知您輸入的XML? –

+0

見上面,在我的問題的第一個代碼塊:帶有一行代碼的XML,「 svenson

+0

你在attr/text()上匹配,但attr元素是空的,所以它有任何文本節點;只是匹配attr元素本身。 –

回答

3

XSLT應該如下:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="no"/> 
    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="attr[@tag='00080090']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:text>this is the inserted text</xsl:text> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

太好了,謝謝!只有一個小副作用:它將文本附加到可能已經存在的文本;標籤可能是空的(自動關閉)或已經包含文本,這兩種情況都應該處理,我需要設置/替換文本;我怎麼能確定? – svenson

+0

您可以添加一個空模板來忽略attr元素中的任何預先存在的文本:'。或者你可以省略最後一個'select'屬性中的'node()'(假設你只想複製'attr'元素的屬性,而不是任何內容)。 –

+0

謝謝Thomas W,省略了最後一個'node()'正在做我所需要的。 – svenson

相關問題