您好我正在使用XSL将一个XML转换为另一个XML.
我面临的问题是标签内部的值是10feb2011
ie <date>10feb2011</date>.
我需要输出为:
<date>10</date>
<month>feb</month>
<year>2011</year>
Run Code Online (Sandbox Code Playgroud)
所以我使用了substring功能,但无法让它工作.
我的XML看起来像
<ArrivalDateTime>
<Date>20feb2011<Date>
</ArrivalDateTime>
Run Code Online (Sandbox Code Playgroud)
它应该转换为这种格式
<ArrivalDateTime>
<dayOfMonth>10</dayOfMonth>
<month>feb</month>
<year>2011</year>
</ArrivalDateTime>
Run Code Online (Sandbox Code Playgroud)
下面是我写的XSL
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:text><![CDATA[<ArrivalDateTime>]]></xsl:text>
<xsl:text><![CDATA[<dayOfMonth>]]></xsl:text>
<xsl:value-of select='substring("<xsl:value-of select="/ArrivalDateTime/Date"/>",1,2)'/>
<xsl:text><![CDATA[</dayOfMonth>]]></xsl:text>
<xsl:text><![CDATA[<month>]]></xsl:text>
<xsl:value-of select='substring("<xsl:value-of select="/ArrivalDateTime/Date"/>",3,3)'/>
<xsl:text><![CDATA[</month>]]></xsl:text>
<xsl:text><![CDATA[<year>]]></xsl:text>
<xsl:value-of select='substring("<xsl:value-of select="/ArrivalDateTime/Date"/>",5,4)'/>
<xsl:text><![CDATA[</year>]]></xsl:text>
<xsl:text><![CDATA[</ArrivalDateTime>]]></xsl:text></xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
你的XSLT看起来过于复杂.只需像这样创建XML节点:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<ArrivalDateTime>
<dayOfMonth>
<xsl:value-of select="substring(/ArrivalDateTime/Date,1,2)"/>
</dayOfMonth>
<month>
<xsl:value-of select="substring(/ArrivalDateTime/Date,3,3)"/>
</month>
<year>
<xsl:value-of select="substring(/ArrivalDateTime/Date,5,4)"/>
</year>
</ArrivalDateTime>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
您不应该使用CDATA部分在输出文档中创建XML节点.这是不必要的并且可能有危险,因为它允许生成无效的XML.
请注意,在XPath表达式中,例如在select属性中,您必须编写有效的XPath.这里不允许使用XML标记.
最好查看一些XSLT教程以开始使用.
您的子串语法不完全正确.您需要使用6,4(而不是5,4)作为年份子串.此外,您不需要使用xsl:text发出xml标记.
试试这个:
<xsl:template match="/">
<ArrivalDateTime>
<dayOfMonth>
<xsl:value-of select="substring(/ArrivalDateTime/Date,1,2)"/>
</dayOfMonth>
<month>
<xsl:value-of select="substring(/ArrivalDateTime/Date,3,3)"/>
</month>
<year>
<xsl:value-of select="substring(/ArrivalDateTime/Date,6,4)"/>
</year>
</ArrivalDateTime>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
替代方案:
您甚至可以使用变量来保存日期,这有点整洁:
<xsl:template match="/">
<xsl:variable name="mydate" select="/ArrivalDateTime/Date" />
<ArrivalDateTime>
<dayOfMonth>
<xsl:value-of select="substring($mydate,1,2)"/>
</dayOfMonth>
<month>
<xsl:value-of select="substring($mydate,3,3)"/>
</month>
<year>
<xsl:value-of select="substring($mydate,6,4)"/>
</year>
</ArrivalDateTime>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)