Необходимо удалить лишний нормальный элемент - PullRequest
1 голос
/ 06 августа 2020

У меня есть элемент, который появляется постоянно, необходимо удалить элемент и переставить его

Вход XML:

<section>
<p class="p heading">Heading</p>
<p class="normal">Text</p>
<ul>
<li><p class="p"><span class="bold">Check</span> - Remaining</p></li>
</ul>
</section>

XSL, который у меня есть, В этом я Я меняю параграф списка на обычный параграф:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:param name="class-map">
   <name>
      <old>heading</old>
      <new>Headings</new>
   </name>
   <name>
      <old>normal</old>
      <new>Actual</new>
   </name>
  </xsl:param>
  
  <xsl:key name="class-map" match="name/new" use="../old"/>
  
  <xsl:template match="p/@class[key('class-map', tokenize(.), $class-map)]">
      <xsl:attribute name="style">
      <xsl:attribute name="{name()}" select="key('class-map', tokenize(.) , $class-map)"/>
      </xsl:attribute>
  </xsl:template>
  
  <xsl:template match="p">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <normal>
      <xsl:apply-templates/>
    </normal>
  </xsl:copy>
</xsl:template>

<xsl:template match="span[@class='bold']">
    <normal style="CD Bold">
      <xsl:apply-templates/>
    </normal>
  </xsl:template>
  
  <xsl:template match="ul">
      <xsl:apply-templates/>
  </xsl:template>
  
  <xsl:template match="li">
      <xsl:apply-templates/>
  </xsl:template>

  <xsl:mode on-no-match="shallow-copy"/>

</xsl:stylesheet>

Ожидаемый результат:

<section>
   <p style="Headings"><normal>Heading</normal></p>
   <p style="Actual"><normal>Text</normal></p>
   <p class="p"><normal style="CD Bold">Check</normal><normal style="normal"> - Remaining</normal></p>
</section>

Необходимо удалить лишний элемент normal и сделать его жирным для класса Bold и переставить на другом месте обычного текста.

1 Ответ

1 голос
/ 06 августа 2020

Я сделал это, просто я написал тот же XML входящий файл, что и вы, так что это тот же вход и выход.

Вот XML / HTML Файл:

<?xml version="1.0" encoding="UTF-8"?>
<section>
    <p class="p heading">Heading</p>
    <p class="normal">Text</p>
    <ul>
        <li>
            <p class="p">
                <span class="bold">Check</span> - Remaining
            </p>
        </li>
    </ul>
</section>

Примечания: Для тегов HTML нам не нужно использовать:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="#all"

Вы должны быть осторожны при импорте некоторых библиотек. Если вы добавили слишком много, ваш код займет больше времени. Это потому, что ваш код должен сначала создать все ссылки на ссылки и .co. Это может быть причиной некоторых ошибок, как и в Java.

С помощью [@...='...'] мы можем вызвать определенные c модификации элемента, например <normal style="CD Bold">, например: normal[@style='CD Bold'

Мои результаты:

<?xml version="1.0" encoding="UTF-8"?><?xe.source ../TemporaryFiles/Test_XML_1.xml?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output media-type="text/xml" method="xml"></xsl:output>
    <xsl:template match="/">
        <section>
            <p style="Headings">
                <normal>
                    <xsl:value-of select="/section/p[@class='p heading']"></xsl:value-of>
                </normal>
            </p>
            <p style="Actual">
                <normal>
                    <xsl:value-of select="/section/p[@class='normal']"></xsl:value-of>
                </normal>
            </p>
            <p class="p">
                <normal style="CD Bold">
                    <xsl:value-of select="/section/ul/li/p[@class='p']/span[@class='bold']"></xsl:value-of>
                </normal>
                <normal style="normal">
                    -<xsl:value-of select="substring-after(/section/ul/li/p[@class='p'],'-')"></xsl:value-of>
                 </normal>
            </p>
        </section>
    </xsl:template>
</xsl:stylesheet>

Строка <?xe.source ../Temporary Files/Test_XML_1.xml?> используется для добавления файла XML непосредственно в XSLT-файл. Путь должен совпадать с вашим

Я добился вашего ожидания с помощью этого простого файла XSLT.

Вот результат:

<?xml version="1.0" encoding="UTF-8"?>
<section>
    <p style="Headings">
        <normal>Heading</normal>
    </p>
    <p style="Actual">
        <normal>Text</normal>
    </p>
    <p class="p">
        <normal style="CD Bold">Check</normal>
        <normal style="normal"> - Remaining </normal>
    </p>
</section>

, если вы хотите получить жирный шрифт в <p class="p"> вы можете использовать эти строки кода здесь:

                 <normal style="CD Bold">
                    <xsl:value-of select="/section/ul/li/p[@class='p']/span[@class='bold']"></xsl:value-of> - <xsl:value-of select="substring-after(/section/ul/li/p[@class='p'],' - ')"></xsl:value-of>
                 </normal>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...