我正在用 Java 编写一个虚拟的“MyAgenda”应用程序,它必须允许维护存储数据的 XML 文件。
假设我有一个 XML 文件,例如:
<myagenda>
<contact>
<name>Matthew Blake</name>
<phone>12345678</phone>
</contact>
</myagenda>
如何使用 XSLT 添加新的 <contact>
?
谢谢。
最佳答案
从 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
元素(使用 *模式中的
意味着您不关心顶级元素的名称是什么)。
关于java - 如何使用 XSL 编辑 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1774937/