根据xslt

时间:2017-02-08 04:11:44

标签: xml xslt xslt-1.0

以下是具有重复的reasoncase元素的输入xml。如果reasonCase下的代码具有以Applicant开头的值,则创建申请者。

<input>
    <case>
        <reasonCase>
            <code>Applicant#1234</code>
            <key>asd345</key>
        </reasonCase>
        <reasonCase>
            <code>Applicant#1234</code>
            <key>asd34567</key>
        </reasonCase>
        <reasonCase>
            <code>Applicant#3456</code>
            <key>asd1111</key>
        </reasonCase>
        <reasonCase>
            <code>Applicant#7889</code>
            <key>asd9999</key>
        </reasonCase>
    </case>
</input>

预期输出是reasonCase下的代码,具有相同的值应该在输出中的同一申请人元素中,相应的元素也应该在同一个申请人元素中

<output>
        <case>
            <applicant>
                <objectid>1234</objectid>
                <reason>
                    <key>asd345</key>
                </reason>
                <reason>
                    <key>asd34567</key>
                </reason>
            </applicant>
            <applicant>
                <objectid>3456</objectid>
                <reason>
                    <key>asd1111</key>
                </reason>
            </applicant>
            <applicant>
                <objectid>7889</objectid>
                <reason>
                    <key>asd9999</key>
                </reason>
            </applicant>
        </case>
    </output>

基于reasonCase / code = start-with(申请人)必须创建重复元素申请人和相应的元素。
请找到我尝试的下面的xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml"/>
        <xsl:template match="/">
            <output>
                <xsl:for-each select="/input/case/reasonCase">
                    <xsl:variable name="code">
                        <xsl:value-of select="./code"/>
                    </xsl:variable>
                    <xsl:choose>
                        <xsl:when test="starts-with(./code,'Applicant')">
                            <Applicants>
                                <objectId>
                                    <xsl:value-of select="substring-after(/*/*/*[code=$code]/code,'Applicant#')"/>
                                </objectId>
                                <reason>
                                    <key><xsl:value-of select="/*/*/*[code=$code]/key"/></key>
                                </reason>
                            </Applicants>
                        </xsl:when>
                    </xsl:choose>
                </xsl:for-each>
            </output>
        </xsl:template>
    </xsl:stylesheet>

我得到的输出如下

<output>
    <Applicants>
        <objectId>1234</objectId>
        <reason>
            <key>asd345</key>
        </reason>
    </Applicants>
    <Applicants>
        <objectId>1234</objectId>
        <reason>
            <key>asd345</key>
        </reason>
    </Applicants>
    <Applicants>
        <objectId>3456</objectId>
        <reason>
            <key>asd1111</key>
        </reason>
    </Applicants>
    <Applicants>
        <objectId>7889</objectId>
        <reason>
            <key>asd9999</key>
        </reason>
    </Applicants>
</output>

请帮助我以获得预期的输出。

2 个答案:

答案 0 :(得分:1)

对于Xsl 1.0,您可以使用

var testArray = [];
var data = [
    {values:[3,4,3,4]},
    {values:[3434]},
    {values:[3,43,4]}
];

for ( i = 0; i < data.length; i++ ) {
    amounts = data[i].values; // amounts should be the values array not its length
  
    testArray = testArray.concat(amounts); // concat testArray with the current values array and store it back into testArray to continue accumulatig the result
}

console.log(testArray);

,输出为

<xsl:template match="input">
<output>
    <case>
        <xsl:for-each select="//code[.!=preceding::code or not(preceding::code)]">
            <xsl:variable name="code" select="text()"/>
            <Applicants>
                <objectid><xsl:value-of select="substring-after(text(), '#')"/></objectid>
                <xsl:for-each select="//key[preceding-sibling::code = $code]">
                    <reason>
                        <xsl:copy-of select="."/>
                    </reason>
                </xsl:for-each>
            </Applicants>
        </xsl:for-each>
    </case>
</output>

答案 1 :(得分:0)

此问题的xslt

<xsl:template match="input">
    <output>
        <case>
            <xsl:for-each-group select="//code" group-by="text()">
                <xsl:variable name="code" select="text()"/>
                <applicant>
                    <objectid><xsl:value-of select="substring-after(text(), '#')"/></objectid>
                    <xsl:for-each select="//key[preceding-sibling::code = $code]">
                        <reason>
                            <xsl:copy-of select="."/>
                        </reason>
                    </xsl:for-each>
                </applicant>
            </xsl:for-each-group>
        </case>
    </output>
</xsl:template>

和输出

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <case>
      <applicant>
         <objectid>1234</objectid>
         <reason>
            <key>asd345</key>
         </reason>
         <reason>
            <key>asd34567</key>
         </reason>
      </applicant>
      <applicant>
         <objectid>3456</objectid>
         <reason>
            <key>asd1111</key>
         </reason>
      </applicant>
      <applicant>
         <objectid>7889</objectid>
         <reason>
            <key>asd9999</key>
         </reason>
      </applicant>
   </case>
</output>