要在xsl中进行子串

Vig*_*nan 2 xml xslt

您好我正在使用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)

Dir*_*mar 9

你的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教程以开始使用.


dog*_*ane 5

您的子串语法不完全正确.您需要使用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)