如何使用XSL编辑XML?

时间:2009-11-21 08:32:22

标签: java xml xslt

我正在用Java编写一个虚拟的“MyAgenda”应用程序,它必须允许维护存储数据的XML文件。

假设我有一个XML文件:

<myagenda>
  <contact>
    <name>Matthew Blake</name>
    <phone>12345678</phone>
  </contact>
</myagenda>

如何使用XSLT添加新的<contact>

感谢。

3 个答案:

答案 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并找到顶级元素下的第一个namephone元素(在模式中使用*表示您不在乎顶级元素的名称是什么。)

答案 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)&gt;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或文本文件。