使用XSLT和Java替换XML节点文本?
XML文件 -
<Remarks>
<Remark>
<Cid>2009-1</Cid>
<Date>3-11-2011 2:55:0</Date>
<Title>Book</Title>
<Comment>XXX</Comment>
</Remark>
<Remark>
<Cid>2009-2</Cid>
<Date>3-12-2011 2:55:0</Date>
<Title>Song</Title>
<Comment>XXX</Comment>
</Remark>
</Remarks>
我想替换< Comment> $ c的文本$ c>特定
< Cid>
。例如;对于Cid 2009-1,
我想更新/更改相应的评论XXX到YYY。这两个值都基于我的java代码将传递的参数。以下是XSLT文件 -
I want to replace the text of <Comment>
for particular <Cid>
. For example; for Cid 2009-1,
I want to update/change the respective Comment XXX to YYY. These both values are based on parameters, which my java code will pass. Following is the XSLT file -
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="ciName" select=""/>
<xsl:param name="coName" select=""/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//Remarks/Remark/Comment[preceding-sibling::Cid='$ciName']">
<xsl:copy>
<xsl:value-of select="$coName"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是部分 Java代码 -
And this is the part Java code -
String cid = "2009-1";
String comm = "YYY";
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("loc1.xslt"));
Transformer transformer = factory.newTransformer(xslt);
transformer.setParameter("ciName",cid);
transformer.setParameter("coName",comm);
Source text = new StreamSource(new File("Comments.xml"));
transformer.transform(text, new StreamResult(new File( "Comments1.xml")));
错误 -
ERROR: 'Premature end of file.'
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Premature end of file.'
Excep......
此外,我无法编辑/替换/更改相应的评论......任何帮助......?在此先感谢。
Also I am NOT able to edit/replace/change the respective comment... Any help....? Thanks in advance.
使用像Saxon 9这样的XSLT 2.0处理器,您可以使用
With an XSLT 2.0 processor like Saxon 9 you could use
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="ciName" select="'2009-1'"/>
<xsl:param name="coName" select="'YYY'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Remark[Cid = $ciName]/Comment">
<xsl:copy>
<xsl:value-of select="$coName"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用XSLT 1.0,不允许在匹配模式中使用变量或参数引用,因此您需要使用
With XSLT 1.0 you are not allowed to use a variable or parameter reference in a match pattern so you need to use
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="ciName" select="'2009-1'"/>
<xsl:param name="coName" select="'YYY'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Remark/Comment">
<xsl:copy>
<xsl:choose>
<xsl:when test="../Cid = $ciName">
<xsl:value-of select="$coName"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>