XSLT,创建新节点

时间:2016-01-26 00:33:30

标签: xslt

我有一个XML,其中input元素将包含100个字符或更多

输入XML

<?xml version="1.0" encoding="UTF-8" ?>
<process xmlns="http://xmlns.oracle.com/TEST/TEST_XSLT/BPEL">
   <input>abcdefghijlnskdckscksncksckscnkscnkscnksdcnksnc</input>
</process>

我的要求是为每5个字符转换和创建新节点。

<?xml version = '1.0' encoding = 'UTF-8'?>
<client:processResponse xmlns:client="http://xmlns.oracle.com/TEST/TEST_XSLT/BPEL">   
   <ns1:Segment-MSG xmlns:ns1="http://schemas.oracle.com/service/bpel/common">
      <ns1:Element-127>acfsd</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG xmlns:ns1="http://schemas.oracle.com/service/bpel/common">
      <ns1:Element-127>serfg</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG xmlns:ns1="http://schemas.oracle.com/service/bpel/common">
      <ns1:Element-127>hjukl</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG xmlns:ns1="http://schemas.oracle.com/service/bpel/common">
      <ns1:Element-127>tyuio</ns1:Element-127>
   </ns1:Segment-MSG>
.
.
.
.

</client:processResponse>

请帮我解决这个转变。

由于 亚坦

1 个答案:

答案 0 :(得分:1)

假设您仅限于XSLT 1.0,请尝试:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:client="http://xmlns.oracle.com/TEST/TEST_XSLT/BPEL"
xmlns:ns1="http://schemas.oracle.com/service/bpel/common">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/client:process">
    <client:processResponse>   
        <xsl:call-template name="split-string">
            <xsl:with-param name="string" select="client:input"/>
        </xsl:call-template>
    </client:processResponse>
</xsl:template>

<xsl:template name="split-string">
    <xsl:param name="string"/>
    <xsl:param name="length" select="5"/>
    <ns1:Segment-MSG>
        <ns1:Element-127>
            <xsl:value-of select="substring($string, 1, $length)"/>
        </ns1:Element-127>
    </ns1:Segment-MSG>
    <xsl:if test="string-length($string) > $length">
        <!-- recursive call -->
        <xsl:call-template name="split-string">
            <xsl:with-param name="string" select="substring($string, $length + 1)"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

当应用于提供的输入时,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<client:processResponse xmlns:client="http://xmlns.oracle.com/TEST/TEST_XSLT/BPEL" xmlns:ns1="http://schemas.oracle.com/service/bpel/common">
   <ns1:Segment-MSG>
      <ns1:Element-127>abcde</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>fghij</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>lnskd</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>cksck</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>sncks</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>ckscn</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>kscnk</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>scnks</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>dcnks</ns1:Element-127>
   </ns1:Segment-MSG>
   <ns1:Segment-MSG>
      <ns1:Element-127>nc</ns1:Element-127>
   </ns1:Segment-MSG>
</client:processResponse>

这与您指定的结果不同,但我认为是正确的。