节点判空和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
*
是转义字符*
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
只能替换一个字符,即oneChar
和anotherChar
都是一个字符的情况下适用
<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语句
中多次比较同一个变量报奇怪的错的时候可以试试使用转义字符
直接比较
字符 转义 描述
< < 小于
<= <= 小于等于
> > 大于
>= >= 大于等于
<> <> 不等于
& &
' '
" "