как поместить множество связок потерянных тегов в другой тег, используя xslt - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть несколько тегов в группах, которые не помещены ни в один тег.но мне нужно поместить его в тег, пока не появится следующий серийный тег

Я пробовал то же самое, но для каждого тега-сироты будет размещаться в разных разделах, что не так, как ожидалось

Ввод XML:

<title>Info111</title>
<ul> underline<ul>
<li>list</li>
<serial>
    <em>this is for em</em>
    <title>serial title</title>
</serial>
<title>Info2222</title>
<ul> underline2222<ul>
<li>li for list</li>

мой код xslt:

<xsl:variable name='list' select='//serial'/>

<xsl:template match='/'>

        <xsl:for-each select='$list'>
            <xsl:element name='serial'>
                <xsl:apply-templates select='*[not(name(.)="serial")]'/>

            </xsl:element>
        </xsl:for-each>

</xsl:template>

фактический вывод

:
<serial>
<title>Info111</title>
</serial>
<serial>
     <ul> underline<ul>
</serial>
<serial>
      <li>list</li>
</serial>
<serial>
    <em>this is for em</em>
    <title>serial title</title>
</serial>
<serial>
    <title>Info2222</title>
</serial>
<serial>
    <ul> underline2222<ul>
</serial>
<serial>
<li>li for list</li>
</serial>

Ожидаемый вывод:

<serial>
     <title>Info111</title>
     <ul> underline<ul>
     <li>list</li>
</serial>

<serial>
    <em>this is for em</em>
    <title>serial title</title>
</serial>

<serial>
    <title>Info2222</title>
    <ul> underline2222<ul>
    <li>li for list</li>
</serial>

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Спасибо за ваш ответ!Теперь он работает нормально с кодом ниже.

<xsl:template match="content/body">
    <xsl:for-each-group select="*" group-adjacent="boolean(self::serial)">
  <xsl:choose>
    <xsl:when test="self::serial">
      <xsl:copy-of select="current-group()"/>
    </xsl:when>
    <xsl:otherwise>
      <serial><xsl:copy-of select="current-group()"/></serial>
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each-group>
    </xsl:template>

, и я получаю ожидаемый результат:)

0 голосов
/ 07 февраля 2019

Это поможет всем, если вы используете правильную терминологию.Я думаю, что под «тегами» вы, вероятно, подразумеваете «элементы».(Элементы на самом деле имеют два тега, начальный тег и конечный тег).Изначально я понятия не имел, что вы имели в виду под «связками», но, изучая ваш пример, я решил, что вы имели в виду «группы».

Входные данные, которые вы показываете, не являются полным документом.В правильно сформированном XML всегда есть корневой элемент.Так что я не знаю, что вы подразумеваете под «потерянными тегами» - у каждого элемента в правильно сформированном XML есть родительский узел.

И хотя мы говорим о вашем вопросе, он помогает всем с вопросами XSLT, еслиВы добавляете в вопрос тег «xslt 1.0», «xslt 2.0» или «xslt 3.0» («тег» в смысле StackOverflow, а не в XML), поскольку это часто влияет на ответ.

Код XSLT, который вы показываете, обрабатывает только элементы в $ list, то есть элементы с именем «serial».Поэтому я не вижу, как вы можете получать выходные данные, содержащие, например, Info111 и Info222.

Код XSLT 2.0 для этого:

<xsl:for-each-group select="*" group-adjacent="boolean(self::serial)">
  <xsl:choose>
    <xsl:when test="self::serial">
      <xsl:copy-of select="current-group()"/>
    </xsl:when>
    <xsl:otherwise>
      <serial><xsl:copy-of select="current-group()"/></serial>
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each-group>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...