使用XSLT和Java替换XML节点文本? [英] Replacing the XML Node text using XSLT and Java?

查看:146
本文介绍了使用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> 特定< 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>

这篇关于使用XSLT和Java替换XML节点文本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆