2017-02-21 30 views
0

У меня есть два набора XML-файла, в котором я хочу использовать один и тот же код XSL как для входного xml-файла.Нужно сделать несоосность для уровней заголовков

Мой первый файл XML является:

<Body> 
<h1>Child1</h1> 
<p>Class1</p> 
<h2>Child2</h2> 
<p>Class2</p> 
<h3>Child3</h3> 
<p>Class3</p> 
<h4>Child4</h4> 
<p>Class4</p> 
</Body> 

XSL I Используется для этого:

<xsl:template match="Body">  
<xsl:for-each-group select="*" group-starting-with="h1"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h2"> 
<xsl:choose> 
<xsl:when test="self::h2"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h3"> 
<xsl:choose> 
<xsl:when test="self::h3"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h4"> 
<xsl:choose> 
<xsl:when test="self::h4"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 
<body><xsl:apply-templates select="current-group() except ."/></body> 
</topic> 
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 

</xsl:for-each-group> 
</topic>      
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 

</xsl:for-each-group> 
</topic> 
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:for-each-group> 
</topic> 
</xsl:for-each-group> 
</xsl:template> 

<xsl:template match="p"> 
<p><xsl:apply-templates/></p> 
</xsl:template> 

Я получил выход, как показано ниже:

<topic id="topic_1"> 
    <title>Child1</title> 
    <body> 
     <p>Class1</p> 
    </body> 
    <topic id="topic_2"> 
     <title>Child2</title> 
     <body> 
     <p>Class2</p> 
     </body> 
     <topic id="topic_3"> 
     <title>Child3</title> 
     <body> 
      <p>Class3</p> 
     </body> 
     <topic id="topic_4"> 
      <title>Child4</title> 
      <body> 
       <p>Class4</p> 
      </body> 
     </topic> 
     </topic> 
    </topic> 
</topic> 

Теперь мой второй XML является (нет h2):

<Body> 
<h1>Child1</h1> 
<p>Class1</p> 
<h3>Child3</h3> 
<p>Class3</p> 
<h4>Child4</h4> 
<p>Class4</p> 
</Body> 

Мой ожидается выход для второго XML будет, как:

<topic id="topic_1"> 
    <title>Child1</title> 
    <body> 
     <p>Class1</p> 
    </body> 
    <topic id="topic_2"> 
     <title/> 
     <body/> 
     <topic id="topic_3"> 
     <title>Child3</title> 
     <body> 
      <p>Class3</p> 
     </body> 
     <topic id="topic_4"> 
      <title>Child4</title> 
      <body> 
       <p>Class4</p> 
      </body> 
     </topic> 
     </topic> 
    </topic> 
</topic> 

Для мне нужно, чтобы получить этот вывод. Как мне изменить XSL-код, о котором я говорил выше. Мне не нужна новая кодировка для этого. Я хочу отредактировать excisting выше XSL-кода. Может ли кто-нибудь помочь мне в этом.

Заранее спасибо

+0

Существует нет, легкий, прямой исправление для существующего кода как очевидно, например, с другой структурой ввода, с отсутствующими элементами, '' будет терпеть неудачу, вы не можете ни подсчитывать, ни группировать элементы, которые не существовать. Вы рассмотрели двухэтапный подход, когда первый шаг добавляет отсутствующие элементы, а второй - ваш существующий код? Вам нужно будет тщательно указать и реализовать первый шаг. –

+0

Хорошо. Спасибо @MartinHonnen. Должен ли я создать отдельный шаблон для второго метода, а также может ли любой другой доступный метод также предоставить мне. – User501

+0

Я бы предложил реализовать первый шаг трансформации, который добавляет отсутствующие элементы в другом режиме, затем обрабатывает вход в этом режиме, сохраняет результат в переменной и затем обрабатывает содержимое переменной с вашим существующим кодом. –

ответ

0

на этот вопрос, ответ здесь:

XSL Я использовал для второго XML является:

<xsl:template match="Body">  
<xsl:for-each-group select="*" group-starting-with="h1"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h2"> 
<xsl:choose> 
<xsl:when test="self::h2"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h3"> 
<xsl:choose> 
<xsl:when test="self::h3"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h4"> 
<xsl:choose> 
<xsl:when test="self::h4"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h2 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 
<body><xsl:apply-templates select="current-group() except ."/></body> 
</topic> 
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 

</xsl:for-each-group> 
</topic>      
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 

</xsl:for-each-group> 
</topic> 
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:for-each-group> 
</topic> 
</xsl:for-each-group> 
</xsl:template> 

<xsl:template match="Body[not(h2)]">  
<xsl:for-each-group select="*" group-starting-with="h1"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h3"> 
<xsl:choose> 
<xsl:when test="self::h3"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 

<xsl:for-each-group select="current-group() except ." group-starting-with="h4"> 
<xsl:choose> 
<xsl:when test="self::h4"> 
<topic> 
<xsl:attribute name="id">topic_<xsl:number count="h1 | h3 | h4"/></xsl:attribute> 
<title> 
<xsl:apply-templates select="node()"/> 
</title> 


</topic>      
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 

</xsl:for-each-group> 
</topic> 
</xsl:when> 
<xsl:otherwise> 
<body><xsl:apply-templates select="current-group()"/></body> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:for-each-group> 
</topic> 
</xsl:for-each-group> 
</xsl:template> 

<xsl:template match="p"> 
<p><xsl:apply-templates/></p> 
</xsl:template>