在xslt中使用java字符串函数
我想在XSLT 1.0中使用java字符串函数。具体来说就是java String替换函数。在xslt中使用java字符串函数
但它失败,出现空指针异常。下面是我的尝试:
1)--Declare namespace and call the java String class <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jString="http://www.oracle.com/XSL/Transform/java/java.lang.String">
2)--Created a template to search for tag inputs that have an ampersand:
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:choose>
<xsl:when test="contains($text, '&')">
<xsl:variable name="str1" select="jString:new($text)"/>
<xsl:value-of select="jString:replace($str1,'&','&')" />
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
3)--Call the template in the specific tags
<Nm>
<xsl:variable name="suppNm">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="Payee/Name" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$suppNm" />
</Nm>
不过,我不断收到一个空指针异常: 引起:oracle.xdo.parser.v2.XPathException:扩展功能错误:错误调用“取代”:'java.lang中。 NullPointerException'
任何人都可以指导我如何使这项工作?
感谢
回答:
分析您的XSL代码:
- 在模板
string-replace-all
有没有封闭标签when
的,所以加</xsl:when>
。 - 输入XML未被显示,因此没有人知道收款人/姓名中的值。看这部分
contains($text, '&')
我想Name
块有价值像sample1 & sample2
。在的情况下&
其后面没有#(例如 
),XML解析器被隐含找五个预定义实体名称lt
,gt
,amp
,quot
和apos
,或者任何手动定义实体名称中的一个。所以在输入XML中,&
必须转义为&
。 - 如果当您使用
jString:replace(string, target, replacement)
NullPointerException异常存在,如果目标或更换为空(Java.lang.String.replace() Method),因此可能问题是目标没有拿起原因&
。 同样替换你可以使用jString:replaceAll(string, regex, replacement)
。 - 最后示例在XSLT用java字符串功能:
对于下面的XML:
<?xml version="1.0"?> <Payee>
<Name>sample1 & sample2</Name>
</Payee>
使用类似于XSL(例如与"
)替换&
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jString="http://www.oracle.com/XSL/Transform/java/java.lang.String"
exclude-result-prefixes="jString" version="1.0">
<xsl:output method="xml"/>
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:choose>
<xsl:when test="contains($text, '&')">
<xsl:variable name="str1" select="jString:new($text)"/>
<xsl:value-of select="jString:replaceAll($str1, '&','"')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<Nm>
<xsl:variable name="suppNm">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="/Payee/Name"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$suppNm" />
</Nm>
</xsl:template>
</xsl:stylesheet>
结果是:
<?xml version="1.0" encoding="UTF-8"?> <Nm>sample1 " sample2</Nm>
主要重要输入XML:
- 如果它简单的文本与
&
如下:
<Payee>
<Name>Jüërgëns GmbH & S's</Name>
</Payee>
- 如果它简单的文本与
- 如果你有如下
&
在<![CDATA[]]>
:
那么你应该有错误:The entity name must immediately follow the '&' in the entity reference.
<Payee>
<Name><![CDATA[Jüërgëns GmbH & S's]]></Name>
</Payee>
然后使用XSL如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:template match="/">
<Nm>
<xsl:value-of select="/Payee/Name" />
</Nm>
</xsl:template>
</xsl:stylesheet>
输出将是如下:
<?xml version="1.0" encoding="UTF-8"?> <Nm>Jüërgëns GmbH & S's</Nm>
希望所有关注上方将与您的情况有所帮助。
回答:
我通过试错找到了解决方案。那么哪个替换为&?效果很好,同样适用于& amp;不起作用。所以我用java字符串处理触点功能来实现这一目标:
下面是最终的模板:
<xsl:template name="string-replace-all"> <xsl:param name="text" />
<xsl:choose>
<xsl:when test="contains($text, '&') or contains($text, '&') ">
<xsl:variable name="str1" select="jString:new(translate($text,'áàâäéèêëíìîïóòôöúùûüç','aaaaeeeeiiiioooouuuuc'))"/>
<xsl:value-of select="(jString:replaceAll(jString:replaceAll($str1,'&',jString:concat('&','amp;')),'&apos;','&amp;apos;'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
以上是 在xslt中使用java字符串函数 的全部内容, 来源链接: utcz.com/qa/265709.html