xslt中设置引用变量,获取节点长度,截取字符串,节点判空和null,去掉首尾空白,遍历集合,获取集合长度,集合是否还有子节点,xslt1.0下replace替换字符

1 篇文章 0 订阅

节点判空和null

demo
item/extendProps/daysToExpire节点判空和null

<xsl:choose>
	<!--存在并且不等于空字符串-->
    <xsl:when test="item/extendProps/daysToExpire and item/extendProps/daysToExpire != ''">
        <xsl:value-of select="item/extendProps/daysToExpire"/>
    </xsl:when>
    <xsl:otherwise>0</xsl:otherwise>
</xsl:choose>

获取某个节点的长度,声明变量和使用变量

有时需要在XSLT中判断某个节点的值的长度.以前我是这样处理:

<xsl:variable name="sChorus" select="chorus"/>
<xsl:variable name="len" select="string-length($sChorus)"/>

去掉首尾空白normalize-space

但后来我就发现了问题.如果节点间有回车等字符,就会被认为值>1.所以后来又用了一个函数去掉字符串中的空白.如下所示:

<xsl:variable name="sChorus" select="chorus"/>
<xsl:variable name="len" select="string-length(normalize-space($sChorus))"/>

截取字符串

函数定义:

string substring(string, number, number?)

返回第一个参数中从第二个参数指定的位置开始、第三个参数指定的长度的子字符串。长度下标从1开始,不像java里下标从0开始即从哪个下标开始截取几个字符.

该字符串中的每个字符都被认为具有数字位置:第一个字符的位置是 1,第二个字符的位置是 2,依此类推。

如果未指定第三个参数,将返回从第二个参数指定的位置开始直到字符串结尾的子字符串。

如果参数不是字符串类型,将先使用 string() 函数转换为字符串,然后计算该转换的结果。

此函数区分大小写。

demo
在这里插入图片描述
demo2

&#42;是转义字符*
xslt的转义字符列表可以参考这位大佬的博客
https://www.cnblogs.com/cb168/articles/5142575.html
在这里插入图片描述
在这里插入图片描述

遍历集合

<xsl:template match="/">
   <request>
       <details>
           <xsl:apply-templates select="/o/request/details/e"/>
       </details>
   </request>
</xsl:template>


<xsl:template match="/o/request/details/e">
	XXXXXXX
</xsl:template>

获取集合长度

<xsl:choose>
    <xsl:when test="count(/o/request/details) > 0">
        <xsl:apply-templates select="/o/request/details/e"/>
    </xsl:when>
    <xsl:otherwise>
        <warehouseCode><xsl:value-of select="/o/request/warehouseCode"/></warehouseCode>
        <companyCode><xsl:value-of select="/o/request/companyCode"/></companyCode>
        <omsOrderCode><xsl:value-of select="/o/request/header/omsOrderCode"/></omsOrderCode>
        <shipmentCode><xsl:value-of select="/o/request/header/shipmentCode"/></shipmentCode>
        <erpOrderCode><xsl:value-of select="/o/request/header/erpOrderCode"/></erpOrderCode>
        <invoiceNumber><xsl:value-of select="/o/request/header/invoiceNumber"/></invoiceNumber>
        <invoiceCode><xsl:value-of select="/o/request/header/invoiceCode"/></invoiceCode>
        <omsLineNum></omsLineNum>
        <itemCode></itemCode>
        <itemName></itemName>
        <lot></lot>
        <quantity></quantity>
        <aduitNote></aduitNote>
    </xsl:otherwise>
</xsl:choose>

遍历集合并且判断集合是否还有子节点

**child::**需要在foreach中进行判断

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <request>
            <details>
                <xsl:apply-templates select="/o/request/details"/>
            </details>
        </request>
    </xsl:template>

    <xsl:template match="/o/request/details">

        <xsl:choose>
            <xsl:when test="child::e"><!--有子节点的时候-->
                <xsl:for-each select="e">
                    <detail>
                        <warehouseCode><xsl:value-of select="/o/request/warehouseCode"/></warehouseCode>
                        <companyCode><xsl:value-of select="/o/request/companyCode"/></companyCode>
                    </detail>
                </xsl:for-each>
            </xsl:when>
            <xsl:otherwise><!--没有子节点的时候-->
                <detail>
                    <warehouseCode><xsl:value-of select="/o/request/warehouseCode"/></warehouseCode>
                    <companyCode><xsl:value-of select="/o/request/companyCode"/></companyCode>
                </detail>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>


</xsl:stylesheet>

其他几个判断

<xsl:if   test="child::*">  
    <!--   表示有子节点   -->  
</xsl:if>  
<xsl:if   test="parent::*">  
    <!--   表示有父节点   -->  
</xsl:if>  
<xsl:if   test="following::*">  
    <!--表示后面还有节点-->  
</xsl:if>  
<xsl:if   test="preceding::*">  
    <!--表示前面还有节点-->  
</xsl:if>

xslt1.0下使用translate来replace替换字符

直接使用replace('内容','pattern', 'anotherContent')xslt2.0的函数,在1.0里没有,但是1.0有一个translate(xxx, 'oneChar', 'anotherChar')函数可以替代下
要注意translate只能替换一个字符,即oneCharanotherChar都是一个字符的情况下适用

<xsl:template match="details/detail/receiptDetail">
    <xsl:variable name="actualArriveDate"><xsl:value-of select="../../../header/receiptHeader/actualArriveDate"/></xsl:variable>
    "RECEIVEDATE": <xsl:value-of select="translate($actualArriveDate,'-','')"/>
    }
    <xsl:if test="position() != last()">,</xsl:if>
</xsl:template>

那要一次性替换多个字符呢,只能自己写个方法了

<!--这一块可以直接复制粘贴,格式固定-->
<xsl:template name="string-replace-all">
    <xsl:param name="text"/>
    <xsl:param name="replace"/>
    <xsl:param name="by"/>
    <xsl:choose>
        <xsl:when test="contains($text, $replace)">
            <xsl:value-of select="substring-before($text, $replace)"/>
            <xsl:value-of select="$by"/>
            <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="substring-after($text, $replace)"/>
                <xsl:with-param name="replace" select="$replace"/>
                <xsl:with-param name="by" select="$by"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="details/detail/receiptDetail">
	<xsl:variable name="qqq">
	    <xsl:call-template name="string-replace-all">
		    <!--原始字符串-->
	        <xsl:with-param name="text" select="'is const content aaa bbb'"/>
	        <!--要被替换的内容-->
	        <xsl:with-param name="replace" select="'con'"/>
	        <!--新的内容-->
	        <xsl:with-param name="by" select="'is new content'"/>
	    </xsl:call-template>
	</xsl:variable>
	<xsl:variable name="actualArriveDate"><xsl:value-of select="../../../header/receiptHeader/actualArriveDate"/></xsl:variable>
	{
	"qqq": "<xsl:value-of select="$qqq"/>",
	"RECEIVEDATE": <xsl:value-of select="translate($actualArriveDate,'-','')"/>
	}
	<xsl:if test="position() != last()">,</xsl:if>
</xsl:template>

比较大小

除了直接用 > ,<,=还可以用转义字符直接比较,有时候在一个test语句中多次比较同一个变量报奇怪的错的时候可以试试使用转义字符直接比较

字符	转义	    描述
<	&lt;	小于
<=	&lt;=	小于等于
>	&gt;	大于
>=	&gt;=	大于等于
<>	&lt;&gt;	不等于
&	&amp;	 
'	&apos;	 
"	&quot;	 

参考文档
https://www.w3school.com.cn/xpath/xpath_axes.asp

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值