我必须用XSLT解决问题而且不知所措。我想我需要字符串长度函数,有些选择测试和子字符串,但我不知道。问题相对简单。
我的xml看起来像下面的示例。但是,我使用了YYYY,MM和DD来表示日期中的数字。
<date normal=”YYYMMDD”> Month, DD, YYYY</date>
<date normal=”YYYY/YYYY”> YYYY-YYYY</date>
<date normal=”YYYYMM”> Month, YYYY</date>
<date normal=”YYYYMM>MM-YYYY</date>
<name normal=”Smith, John”> John Smith </name>
我需要按原样打印所有元素,除了JUST两个具有属性normal=”YYYYMM”
的元素。它们需要打印,但格式为normal=YYYY-MM
我不能依赖元素中的素材,因为它往往是各种不同的格式,因为它是自由文本。
我一直在尝试使用字符串长度函数来识别元素日期中包含6个字符的属性值。但后来我无法弄清楚如何用连字符分割输出中的字符串。我猜它使用了一个子串函数,但我无法让所有东西一起工作。
感谢您提供任何建议, 恭
答案 0 :(得分:0)
这样的东西?:
<xsl:choose>
<xsl:when text="string-length(@normal) = 6 and number(@normal) = number(@normal)">
<xsl:value-of select="concat(substring(@normal, 1, 4), '-', substring(@normal, 5, 2))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@normal" />
</xsl:otherwise>
</xsl:choose>
number(@normal) = number(@normal)
检查确保@normal
是一个数字,因为您在normal
属性中看起来也有一些非日期值。它有可能是一个6位数的非日期数字吗?
答案 1 :(得分:0)
这个完整而短暂的转变:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@normal[string-length()=6]">
<xsl:attribute name="normal">
<xsl:value-of select="concat(substring(.,1,4),'-',substring(.,5))"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
应用于以下XML文档(提供的片段包装到单个顶部元素中):
<t>
<date normal="YYYMMDD"> Month, DD, YYYY</date>
<date normal="YYYY/YYYY"> YYYY-YYYY</date>
<date normal="YYYYMM"> Month, YYYY</date>
<date normal="YYYYMM">MM-YYYY</date>
<name normal="Smith, John"> John Smith </name>
</t>
会产生想要的正确结果:
<t>
<date normal="YYYMMDD"> Month, DD, YYYY</date>
<date normal="YYYY/YYYY"> YYYY-YYYY</date>
<date normal="YYYY-MM"> Month, YYYY</date>
<date normal="YYYY-MM">MM-YYYY</date>
<name normal="Smith, John"> John Smith </name>
</t>