Java 用动态值替换XSLT?
我有一个xsl模板,可以替换一些xml值。 现在,我希望这些值由我的代码动态生成Java 用动态值替换XSLT?,java,xml,xslt,Java,Xml,Xslt,我有一个xsl模板,可以替换一些xml值。 现在,我希望这些值由我的代码动态生成 Transformer trans = TransformerFactory.newInstance().newTransformer(new StreamSource(new File("foo.xsl")); trans.transform(new StreamSource(new File("foo.xml"), new StreamResult(new File("output.xml"))); 我如何才
Transformer trans = TransformerFactory.newInstance().newTransformer(new StreamSource(new File("foo.xsl"));
trans.transform(new StreamSource(new File("foo.xml"), new StreamResult(new File("output.xml")));
我如何才能访问,例如仅在id=1时替换名称?而且通过javacode动态提供id,而不是硬编码
<?xml version="1.0"?>
<my:accounts xmlns:my="http://myns">
<my:account>
<my:name>alex</my:name>
<my:id>1</my:id>
</my:account>
<my:account>
<my:name>Fiona</my:name>
<my:id>2</my:id>
</my:account>
</my:accounts>
亚历克斯
1.
Fiona
2.
这将替换所有名称:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://myns">
<xsl:param name="propertyName" select="'alex'"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()[.='{$propertyName}']">
<xsl:text>johndoe</xsl:text>
</xsl:template>
</xsl:stylesheet>
约翰多
您可以在xsl样式表中定义一个参数
<xsl:param name="id" select="'0'"/>
然后在Java中将其作为参数传递:
trans.setParameter(“id”、“1”)
那对你有用吗?还是要传递多个参数
类似于所引用的内容
这个xsl可以工作,但它在2.0中
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://myns">
<xsl:param name="id" select="'1'"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[local-name()='account'][*:id=$id]/*[local-name()='name']/text()">
<xsl:text>johndoe</xsl:text>
</xsl:template>
</xsl:stylesheet>
约翰多
此转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://myns">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pId" select="2"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="my:name/text()">
<xsl:choose>
<xsl:when test="../../my:id = $pId">johndoe</xsl:when>
<xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
<my:accounts xmlns:my="http://myns">
<my:account>
<my:name>alex</my:name>
<my:id>1</my:id>
</my:account>
<my:account>
<my:name>johndoe</my:name>
<my:id>2</my:id>
</my:account>
</my:accounts>
约翰多
应用于提供的XML文档时:
<my:accounts xmlns:my="http://myns">
<my:account>
<my:name>alex</my:name>
<my:id>1</my:id>
</my:account>
<my:account>
<my:name>Fiona</my:name>
<my:id>2</my:id>
</my:account>
</my:accounts>
亚历克斯
1.
Fiona
2.
生成所需的正确结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://myns">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pId" select="2"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="my:name/text()">
<xsl:choose>
<xsl:when test="../../my:id = $pId">johndoe</xsl:when>
<xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
<my:accounts xmlns:my="http://myns">
<my:account>
<my:name>alex</my:name>
<my:id>1</my:id>
</my:account>
<my:account>
<my:name>johndoe</my:name>
<my:id>2</my:id>
</my:account>
</my:accounts>
亚历克斯
1.
约翰多
2.
说明:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://myns">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pId" select="2"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="my:name/text()">
<xsl:choose>
<xsl:when test="../../my:id = $pId">johndoe</xsl:when>
<xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
<my:accounts xmlns:my="http://myns">
<my:account>
<my:name>alex</my:name>
<my:id>1</my:id>
</my:account>
<my:account>
<my:name>johndoe</my:name>
<my:id>2</my:id>
</my:account>
</my:accounts>
。虽然设置了一个默认值,但它会被转换调用程序指定的值覆盖试试@Dimitre Novatchev's,它似乎是有效的,它是1.0合规的一个很好的例子,它是有效的。但是如果我将id更改为字符串,比如说
test
和
这不起作用。我错过了什么?@membersound,不客气。是的,您必须指定字符串文字,否则它将被解释为节点名。