[英]XSLT transformation not applied to complex XML
I have a custom XML as shwon below我有一个自定义 XML 如下所示
<AllValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<content>
<data>
<item>
<value xsi:type="DATETIME">
<value>2020-12-31T09:30:00+00:00</value>
</value>
</item>
</data>
</content>
</AllValues>
From the defined styles sheet I would like to extract out the 2020-12-31T09:30:00+00:00
as September 24th, 2020 09:30
.从定义的 styles 表中,我想提取
2020-12-31T09:30:00+00:00
为September 24th, 2020 09:30
。 However seems like the style sheet fails to identify the element in this case.但是,在这种情况下,样式表似乎无法识别元素。
My style sheet (adapted from here ) is defined as below我的样式表(改编自此处)定义如下
<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>
A very basic scenario of this seems to work fine but I cant get a complect xml transformed here.一个非常基本的场景似乎工作正常,但我无法在这里转换一个完整的 xml。 Here is the implementation of a basic situation where it works https://xsltfiddle.liberty-development.net/bEzknt7/1
这是它工作的基本情况的实现https://xsltfiddle.liberty-development.net/bEzknt7/1
Would really appreciate some help here非常感谢这里的一些帮助
You are simply not matching the right node in your XSLT.您根本没有匹配 XSLT 中的正确节点。
Change the date
node in your expressions to .
将表达式中的
date
节点更改为.
and set the right context node in your template:并在模板中设置正确的上下文节点:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="//*[@xsi:type='DATETIME']/value">
<xsl:element name="output">
<xsl:variable name="month" select="substring(., 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(., 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(., 1, 4)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring(., 12, 5)"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Its output is:其 output 为:
<output>December 31st, 2020 09:30</output>
This works fine for your MCVE and works for all elements with the xsi:type
attribute equal to DATETIME
.这适用于您的 MCVE,并且适用于
xsi:type
属性等于DATETIME
的所有元素。
If your input has multiple dateTime
values that need to be converted, then define a named template to serve as a function that can be called when a dateTime
value is encountered.如果您的输入有多个需要转换的
dateTime
值,则定义一个命名模板作为 function 可以在遇到dateTime
值时调用。 For example:例如:
XML XML
<AllValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<content>
<data>
<item>
<value xsi:type="STRING">
<value>Alpha</value>
</value>
</item>
<item>
<value xsi:type="DATETIME">
<value>2019-08-02T15:05:00+00:00</value>
</value>
</item>
</data>
<data>
<item>
<value xsi:type="STRING">
<value>Bravo</value>
</value>
</item>
<item>
<value xsi:type="DATETIME">
<value>2020-12-31T09:30:00+00:00</value>
</value>
</item>
</data>
</content>
</AllValues>
XSLT 1.0 XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value[@xsi:type='DATETIME']/value">
<xsl:copy>
<xsl:call-template name="convert-dateTime">
<xsl:with-param name="dateTime" select="."/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="convert-dateTime">
<xsl:param name="dateTime"/>
<xsl:variable name="month" select="substring($dateTime, 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($dateTime, 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($dateTime, 1, 4)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring($dateTime, 12, 5)"/>
</xsl:template>
</xsl:stylesheet>
Result结果
<?xml version="1.0" encoding="UTF-8"?>
<AllValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<content>
<data>
<item>
<value xsi:type="STRING">
<value>Alpha</value>
</value>
</item>
<item>
<value xsi:type="DATETIME">
<value>August 2nd, 2019 15:05</value>
</value>
</item>
</data>
<data>
<item>
<value xsi:type="STRING">
<value>Bravo</value>
</value>
</item>
<item>
<value xsi:type="DATETIME">
<value>December 31st, 2020 09:30</value>
</value>
</item>
</data>
</content>
</AllValues>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.