Xml XSLT:检查序列中的元素忽略大小写-如果必须删除当前节点
输入XML结构:Xml XSLT:检查序列中的元素忽略大小写-如果必须删除当前节点,xml,xslt,Xml,Xslt,输入XML结构: <ITEMS> <ITEM> <ITEMTYPE>FOO</ITEMTYPE> </ITEM> <ITEM> <ITEMTYPE>BAR</ITEMTYPE> </ITEM> </ITEMS> 福 酒吧 我将把序列作为参数传递给XSLT。如果序列中存在ITEMTYPE,则必须删除节点。而且它必须以不区分大小
<ITEMS>
<ITEM>
<ITEMTYPE>FOO</ITEMTYPE>
</ITEM>
<ITEM>
<ITEMTYPE>BAR</ITEMTYPE>
</ITEM>
</ITEMS>
福
酒吧
我将把序列作为参数传递给XSLT。如果序列中存在ITEMTYPE,则必须删除节点。而且它必须以不区分大小写的方式处理
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="#all">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="itemsToRemove"/>
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ITEM">
<xsl:variable name="currentItemType">
<xsl:value-of select="itemType"/>
</xsl:variable>
<xsl:if test="not(fn:index-of($itemsToRemove, $currentItemType))">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我是XSLT的新手。我编写了如下代码,但无法破解不区分大小写的代码
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="#all">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="itemsToRemove"/>
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ITEM">
<xsl:variable name="currentItemType">
<xsl:value-of select="itemType"/>
</xsl:variable>
<xsl:if test="not(fn:index-of($itemsToRemove, $currentItemType))">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
如果要使用不区分大小写的值比较,一种方法是使用带有
i
标志的匹配
函数:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:param name="itemsToRemove" select="'foo'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ITEM[$itemsToRemove[matches(., current()/ITEMTYPE, 'i')]]"/>
</xsl:transform>
然后是输出
<ITEMS>
<ITEM>
<ITEMTYPE>BAR</ITEMTYPE>
</ITEM>
</ITEMS>
酒吧
如果要使用不区分大小写的值比较,一种方法是使用带有i
标志的匹配
函数:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:param name="itemsToRemove" select="'foo'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ITEM[$itemsToRemove[matches(., current()/ITEMTYPE, 'i')]]"/>
</xsl:transform>
然后是输出
<ITEMS>
<ITEM>
<ITEMTYPE>BAR</ITEMTYPE>
</ITEM>
</ITEMS>
酒吧
什么必须不区分大小写,比较ITEMTYPE
的值,或者元素的名称(就像XML中的ITEMTYPE
但是XSLT中的ITEMTYPE
一样)?什么必须不区分大小写,比较ITEMTYPE
的值,或者元素的名称(正如XML中有ITEMTYPE
,但XSLT中有ITEMTYPE
)函数当前应该在编译时解析(java.lang.IllegalStateException)net.sf.saxon.functions.CompileTimeFunction:41(null)@Martin Honnen:当我从java程序运行时,我遇到了这个错误。当你遇到这个错误时,你能告诉我们你到底在使用哪个版本的Saxon吗?当你从命令行运行这个版本的代码时,是否也会发生这种情况?你可能需要创建一个新的问题,在其中显示所有细节以允许其他人使用若要重现此问题,应在编译时(java.lang.IllegalStateException)net.sf.saxon.functions.CompileTimeFunction:41(null)解决当前函数@Martin Honnen:当我从java程序运行时,我遇到了这个错误。当你遇到这个错误时,你能告诉我们你到底在使用哪个版本的Saxon吗?当你从命令行运行这个版本的代码时,是否也会发生这种情况?你可能需要创建一个新的问题,在其中显示所有细节以允许其他人使用重现问题。