2017-02-08 15 views
0

Ниже представлен входной XML-адрес, в котором есть элемент аргументации, который повторяется. Если код в базе reasonCase имеет значение, начинающееся с кандидата, затем создайте заявителя.создавать повторяющиеся элементы на основе значения поля в xslt

<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/код = 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> 

Пожалуйста, помогите мне, чтобы получить ожидаемый результат.

+0

Где именно вы застряли в этом? –

+0

У меня есть требование, как показано выше. Im неспособно реализовать любую логику для того же самого. Нужна помощь с логикой. – user1731504

+0

Мы не здесь, чтобы написать код для вас. Если у вас есть конкретный вопрос или трудность, покажите свою попытку и спросите, как ее исправить. –

ответ

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> 
+0

Спасибо за это, но мы нуждаемся в нем с версией xslt 1.0 – user1731504

+0

теперь вы можете увидеть обновленный xslt 1.0 – Rupesh

+0

' zx485

1

Для Xsl 1,0 Вы можете использовать

<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> 

и выход для этого

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

Это нехороший метод - см. Здесь почему: http://www.jenitennison.com/xslt/grouping/muenchian.html –

 Смежные вопросы

  • Нет связанных вопросов^_^