Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT根据输入数据的长度动态添加元素_Xml_Xslt_Xslt 1.0_Xslt 2.0_Xslt 3.0 - Fatal编程技术网

Xml XSLT根据输入数据的长度动态添加元素

Xml XSLT根据输入数据的长度动态添加元素,xml,xslt,xslt-1.0,xslt-2.0,xslt-3.0,Xml,Xslt,Xslt 1.0,Xslt 2.0,Xslt 3.0,我们有一个输入XML消息,它在元素中包含一个编码字符串。要求是我们希望根据该字符串的长度创建输出XML消息。预期输出元素的长度限制为10个字符,并且该元素可以重复的次数没有限制 示例: 例如,在下面的消息中,您可以看到我们有一个元素EncodedString,它包含一个长度为100个字符的字符串。在输出中,我们希望将EncodedStringValue元素重复10次,因为每个元素声明的最大限制为10个字符。 请注意,在实际场景中,我们可以使用的字符限制可能在10个之间 输入XML <?xm

我们有一个输入XML消息,它在元素中包含一个编码字符串。要求是我们希望根据该字符串的长度创建输出XML消息。预期输出元素的长度限制为10个字符,并且该元素可以重复的次数没有限制

示例:

例如,在下面的消息中,您可以看到我们有一个元素EncodedString,它包含一个长度为100个字符的字符串。在输出中,我们希望将EncodedStringValue元素重复10次,因为每个元素声明的最大限制为10个字符。 请注意,在实际场景中,我们可以使用的字符限制可能在10个之间

输入XML

<?xml version="1.0" encoding="UTF-8"?>
      <Message xmlns="http://ws.apache.org/ns/synapse">
         <MessageID>365</MessageID>
         <EncodedString>PHJvb3Q6SW52b2ljZSB4bWxuczpyb290PSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpJbnZv</EncodedString>
    </Message>
<?xml version="1.0" encoding="UTF-8"?>
  <Message xmlns="http://ws.apache.org/ns/synapse">
     <MessageID>365</MessageID>
     <EncodedStringValue>PHJvb3Q6SW</EncodedStringValue>
     <EncodedStringValue>52b2ljZSB4</EncodedStringValue> 
     <EncodedStringValue>bWxuczpyb2</EncodedStringValue>
     <EncodedStringValue>90PSJ1cm46</EncodedStringValue>
     <EncodedStringValue>b2FzaXM6bm</EncodedStringValue>
     <EncodedStringValue>FtZXM6c3Bl</EncodedStringValue>
     <EncodedStringValue>Y2lmaWNhdG</EncodedStringValue>
     <EncodedStringValue>lvbjp1Ymw6</EncodedStringValue>
     <EncodedStringValue>c2NoZW1hOn</EncodedStringValue>
     <EncodedStringValue>hzZDpJbnZv</EncodedStringValue>
</Message>

365
PHJVB3Q6SW52B2LJZSB4BWXUCZPYB290PSJ1CM46B2FZAXM6BMFTZXM6C3BLY2LMAWNHDGLVBJP1YMW6C2NOZW1HONHZDPJBNZV
预期输出XML

<?xml version="1.0" encoding="UTF-8"?>
      <Message xmlns="http://ws.apache.org/ns/synapse">
         <MessageID>365</MessageID>
         <EncodedString>PHJvb3Q6SW52b2ljZSB4bWxuczpyb290PSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpJbnZv</EncodedString>
    </Message>
<?xml version="1.0" encoding="UTF-8"?>
  <Message xmlns="http://ws.apache.org/ns/synapse">
     <MessageID>365</MessageID>
     <EncodedStringValue>PHJvb3Q6SW</EncodedStringValue>
     <EncodedStringValue>52b2ljZSB4</EncodedStringValue> 
     <EncodedStringValue>bWxuczpyb2</EncodedStringValue>
     <EncodedStringValue>90PSJ1cm46</EncodedStringValue>
     <EncodedStringValue>b2FzaXM6bm</EncodedStringValue>
     <EncodedStringValue>FtZXM6c3Bl</EncodedStringValue>
     <EncodedStringValue>Y2lmaWNhdG</EncodedStringValue>
     <EncodedStringValue>lvbjp1Ymw6</EncodedStringValue>
     <EncodedStringValue>c2NoZW1hOn</EncodedStringValue>
     <EncodedStringValue>hzZDpJbnZv</EncodedStringValue>
</Message>

365
PHJvb3Q6SW
52b2ljZSB4
bWxuczpyb2
90PSJ1cm46
b2FzaXM6bm
FtZXM6c3Bl
Y2lmaWNhdG
lvbjp1Ymw6
c2NoZW1hOn
hzZDpJbnZv
问题?


使用XSLT是否可以实现上述要求?如果是,那么如何使用字符串函数拆分数据,例如在XSLT中使用
分析字符串

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="EncodedString">
      <xsl:apply-templates select="analyze-string(., '.{1,10}')/*:match">
          <xsl:with-param name="name" select="node-name()"/>
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="*:match">
      <xsl:param name="name"/>
      <xsl:element name="{$name}" namespace="{namespace-uri-from-QName($name)}">{.}</xsl:element>
  </xsl:template>

</xsl:stylesheet>

{.}

使用字符串函数拆分数据,例如在XSLT中使用
分析字符串

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="EncodedString">
      <xsl:apply-templates select="analyze-string(., '.{1,10}')/*:match">
          <xsl:with-param name="name" select="node-name()"/>
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="*:match">
      <xsl:param name="name"/>
      <xsl:element name="{$name}" namespace="{namespace-uri-from-QName($name)}">{.}</xsl:element>
  </xsl:template>

</xsl:stylesheet>

{.}

在XSLT 2.0中,可以执行以下操作:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <Message>
            <xsl:apply-templates select="node()"/>
        </Message>
    </xsl:template>
    <xsl:template match="MessageID">
        <xsl:copy-of select="."></xsl:copy-of>
    </xsl:template>
    <xsl:template match="EncodedString">
        <xsl:variable name="rep">
            <xsl:value-of select="replace(.,'([0-9A-z]{1,10})','$1 ')"/>
        </xsl:variable>
        <xsl:for-each select="tokenize($rep,' ')[position()!=last()]">
            <EncodedStringValue>
                <xsl:value-of select="."/>
            </EncodedStringValue>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>


在XSLT 2.0中,可以执行以下操作:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <Message>
            <xsl:apply-templates select="node()"/>
        </Message>
    </xsl:template>
    <xsl:template match="MessageID">
        <xsl:copy-of select="."></xsl:copy-of>
    </xsl:template>
    <xsl:template match="EncodedString">
        <xsl:variable name="rep">
            <xsl:value-of select="replace(.,'([0-9A-z]{1,10})','$1 ')"/>
        </xsl:variable>
        <xsl:for-each select="tokenize($rep,' ')[position()!=last()]">
            <EncodedStringValue>
                <xsl:value-of select="."/>
            </EncodedStringValue>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>