У меня есть два набора 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-кода. Может ли кто-нибудь помочь мне в этом.
Заранее спасибо
Существует нет, легкий, прямой исправление для существующего кода как очевидно, например, с другой структурой ввода, с отсутствующими элементами, ' ' будет терпеть неудачу, вы не можете ни подсчитывать, ни группировать элементы, которые не существовать. Вы рассмотрели двухэтапный подход, когда первый шаг добавляет отсутствующие элементы, а второй - ваш существующий код? Вам нужно будет тщательно указать и реализовать первый шаг. –
Хорошо. Спасибо @MartinHonnen. Должен ли я создать отдельный шаблон для второго метода, а также может ли любой другой доступный метод также предоставить мне. – User501
Я бы предложил реализовать первый шаг трансформации, который добавляет отсутствующие элементы в другом режиме, затем обрабатывает вход в этом режиме, сохраняет результат в переменной и затем обрабатывает содержимое переменной с вашим существующим кодом. –