我正在用Java编写一个虚拟的“MyAgenda”应用程序,它必须允许维护存储数据的XML文件。
假设我有一个XML文件:
<myagenda>
<contact>
<name>Matthew Blake</name>
<phone>12345678</phone>
</contact>
</myagenda>
如何使用XSLT添加新的<contact>
?
感谢。
答案 0 :(得分:4)
从identity transform开始,将任何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
并找到顶级元素下的第一个name
和phone
元素(在模式中使用*
表示您不在乎顶级元素的名称是什么。)
答案 1 :(得分:3)
在xsl样式表的标头中使用xsl:param作为全局参数。
<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>
(...)
答案 2 :(得分:1)
XSLT将1 xml文件转换为另一个xml或文本文件。