[英]How to edit XML with XSL?
我正在用Java編寫一個虛擬的“ MyAgenda”應用程序,該應用程序必須允許維護存儲數據的XML文件。
假設我有一個XML文件,例如:
<myagenda>
<contact>
<name>Matthew Blake</name>
<phone>12345678</phone>
</contact>
</myagenda>
如何使用XSLT添加新的<contact>
?
謝謝。
從身份轉換開始,該轉換將任何XML文檔轉換為自身。
身份轉換是一台簡單的機器:給定一棵樹,它以遞歸方式復制找到的每個節點。 您將覆蓋一個特定節點( myagenda
元素)的行為,它將以另一種方式復制它。
為此,添加一個與您要更新的元素匹配的模板並將其復制。 在您的情況下:
<xsl:template match="myagenda">
<xsl:copy-of select=".">
<xsl:apply-templates select="node() | @*"/>
</xsl:copy-of>
</xsl:template>
您可能會想,“等等,這不是身份轉換嗎?” 是的,但是不會一直這樣。
現在,決定如何將新的聯系信息添加到轉換中。 基本上有兩種方法:使用document
函數從單獨的XML文檔中讀取它,或使用參數將值傳遞到轉換中。 假設您正在使用參數; 在這種情況下,請將以下內容添加到XSLT的頂部( xsl:output
元素之后):
<xsl:param name="contactName"/>
<xsl:param name="contactPhone"/>
現在,您不想將myagenda
轉換為自身的副本,而是希望將其轉換為其中具有新contact
的自身的副本。 因此,修改模板即可:
<xsl:template match="myagenda">
<xsl:copy-of select=".">
<xsl:apply-templates select="node() | @*"/>
<contact>
<name><xsl:value-of select="$contactName"/></name>
<phone><xsl:value-of select="$contactPhone"/></phone>
</contact>
</xsl:copy-of>
</xsl:template>
如果要從文件系統中的單獨XML文檔中獲取名稱和電話,則可以使用以下方法啟動XSLT:
<xsl:variable name="contact" value="document('contact.xml')"/>
<xsl:variable name="contactName" value="$contact/*/name[1]'/>
<xsl:variable name="contactPhone" value=$contact/*/phone[1]'>
contact.xml
讀取contact.xml
並在頂級元素下找到name
和phone
元素(在模式中使用*
表示您不必關心頂級元素的名稱是什么)。
使用xsl:param作為xsl樣式表標題中的全局參數。
<xsl:param name="newname"/>
<xsl:param name="newphone"/>
用您的xslt引擎填充新參數,然后通過模板添加新項目:
(...)
<xsl:template match="myagenda">
<xsl:apply-templates select="contact"/>
<xsl:if test="string-length($newname)>0">
<xsl:element name="contact">
<xsl:element name="name">
<xsl:value-of select="$newname"/>
</xsl:element>
<xsl:element name="phone">
<xsl:value-of select="$newphone"/>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:template>
(...)
XSLT將1個xml文件轉換為另一個xml或文本文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.