使用带有附加信息的 xslt 转换 xml
Posted
技术标签:
【中文标题】使用带有附加信息的 xslt 转换 xml【英文标题】:Transforming xml using xslt with additional information 【发布时间】:2020-09-05 22:18:45 【问题描述】:我目前正在使用我找到的here 的 xsl 样式表,并且我正在尝试添加一定的改进,以便用 date 呈现时间。
当前通过特定日期时,输出呈现为<output>September 24th, 2020</output>
,但我还想包括类似于下面的时间
2020年9月24日09:30
知道如何改进
输入为:-2020-09-24T09:30:00+00:00
我的代码如下
string xsltPath = @ "D:\xslt\xslt.xml";
string xslt = File.ReadAllText(xsltPath);
var oldDocument = new XDocument(
new XElement("date", "2020-09-24T09:30:00+00:00")
);
var newDocument = new XDocument();
using(var stringReader = new StringReader(xslt))
using(XmlReader xsltReader = XmlReader.Create(stringReader))
var transformer = new XslCompiledTransform();
transformer.Load(xsltReader);
using(XmlReader oldDocumentReader = oldDocument.CreateReader())
using(XmlWriter newDocumentWriter = newDocument.CreateWriter())
transformer.Transform(oldDocumentReader, newDocumentWriter);
string result = newDocument.ToString();
Console.WriteLine(result);
XSL 样式表定义如下
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<output>
<xsl:variable name="month" select="substring(date, 6, 2)"/>
<xsl:choose>
<xsl:when test="$month=1">January</xsl:when>
<xsl:when test="$month=2">February</xsl:when>
<xsl:when test="$month=3">March</xsl:when>
<xsl:when test="$month=4">April</xsl:when>
<xsl:when test="$month=5">May</xsl:when>
<xsl:when test="$month=6">June</xsl:when>
<xsl:when test="$month=7">July</xsl:when>
<xsl:when test="$month=8">August</xsl:when>
<xsl:when test="$month=9">September</xsl:when>
<xsl:when test="$month=10">October</xsl:when>
<xsl:when test="$month=11">November</xsl:when>
<xsl:when test="$month=12">December</xsl:when>
</xsl:choose>
<xsl:text> </xsl:text>
<xsl:variable name="day" select="number(substring(date, 9, 2))"/>
<xsl:value-of select="$day"/>
<xsl:choose>
<xsl:when test="$day=1 or $day=21 or $day=31">st</xsl:when>
<xsl:when test="$day=2 or $day=22">nd</xsl:when>
<xsl:otherwise>th</xsl:otherwise>
</xsl:choose>
<xsl:text>, </xsl:text>
<xsl:value-of select="substring(date, 1, 4)"/>
</output>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
请注意,对于 .NET/C#,您可以选择 XSLT 2 或 3 和 Saxon 9 .NET,然后使用format-dateTime(xs:dateTime(date), '[MNn] [D1o], [Y] [H01]:[m01]')
。如果您想使用 XslCompiledTransform,我会考虑使用 .NET 框架的日期格式的扩展。
【参考方案1】:
您可以使用子字符串从日期中提取时间:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<output>
<xsl:variable name="month" select="substring(date, 6, 2)"/>
<xsl:choose>
<xsl:when test="$month=1">January</xsl:when>
<xsl:when test="$month=2">February</xsl:when>
<xsl:when test="$month=3">March</xsl:when>
<xsl:when test="$month=4">April</xsl:when>
<xsl:when test="$month=5">May</xsl:when>
<xsl:when test="$month=6">June</xsl:when>
<xsl:when test="$month=7">July</xsl:when>
<xsl:when test="$month=8">August</xsl:when>
<xsl:when test="$month=9">September</xsl:when>
<xsl:when test="$month=10">October</xsl:when>
<xsl:when test="$month=11">November</xsl:when>
<xsl:when test="$month=12">December</xsl:when>
</xsl:choose>
<xsl:text> </xsl:text>
<xsl:variable name="day" select="number(substring(date, 9, 2))"/>
<xsl:value-of select="$day"/>
<xsl:choose>
<xsl:when test="$day=1 or $day=21 or $day=31">st</xsl:when>
<xsl:when test="$day=2 or $day=22">nd</xsl:when>
<xsl:otherwise>th</xsl:otherwise>
</xsl:choose>
<xsl:text>, </xsl:text>
<xsl:value-of select="substring(date, 1, 4)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring(date, 12, 5)"/>
</output>
</xsl:template>
</xsl:stylesheet>
在这里看到它的工作:https://xsltfiddle.liberty-development.net/bEzknt7
【讨论】:
以上是关于使用带有附加信息的 xslt 转换 xml的主要内容,如果未能解决你的问题,请参考以下文章
使用 XSLT 将 XML 转换为带有嵌套 AND/OR 的“布尔”英文句子
Adobe LiveCycle:使用 XSLT 将 XML 转换为 XML