Nano Hash - криптовалюты, майнинг, программирование

Создайте новый узел, используя подстроку подузла

У меня есть XML-документ, который выглядит так:

<oldEle userlabel="label1">
  <ele1>%02d.jpeg</ele1>
</oldEle>

<oldEle userlabel="label2">
  <ele1>%02d.tiff</ele1>
</oldEle>

Я хочу, чтобы это было так:

<JPEG userlabel="label1">
  <ele1>%02d.jpeg</ele1>
</JPEG>

<TIFF userlabel="label2">
  <ele1>%02d.tiff</ele1>
</TIFF>

Я пробовал это.

<xsl:template match="//xmlns:oldNode[contains(//xmlsns:oldNode/root:ele1, '.')]">
  <xsl:element name="{translate(substring-after(//xmlns:ele1, '.'),
               'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">
      <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

но получить только первый из файлов ext. например если jpeg будет первым, я получу оба узла. Может ли кто-нибудь дать экспертный совет о том, почему это не работает.

Кстати, я также пробовал это, но произошло то же самое:

<xsl:template match="//xmlns:oldNode[contains(//root:ele1, '.jpeg')]">
  <xsl:element name="JPEG">
      <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="//xmlns:oldNode[contains(//root:ele1, '.tiff')]">
  <xsl:element name="TIFF">
      <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>
05.06.2012

  • Помимо очевидной проблемы, заключающейся в том, что вы передаете набор узлов, а не один узел в качестве аргумента contains(), обратите внимание, что просто использовать contains() недостаточно — текст может быть: %02d.jpeg.tiff 07.06.2012

Ответы:


1

Первая проблема связана с вашим соответствующим шаблоном

 <xsl:template match="//xmlns:oldNode[contains(//xmlsns:oldNode/root:ele1, '.')]">

В частности, с элементом contains вам, вероятно, не нужен //oldNode впереди, так как он начнет поиск первого oldNode относительно корневого элемента. Что вам действительно нужно, так это искать элемент ele1 относительно элемента, который вы в настоящее время сопоставили.

<xsl:template match="//oldNode[contains(ele1, '.')]">

(Кстати, я не уверен, имеете ли вы в виду oldNode или oldEle. Я также не уверен, где подходят ваши пространства имен, поэтому я не показывал их здесь).

Вторая проблема связана с xsl:element, так как здесь вы делаете то же самое.

<xsl:element name="{translate(substring-after(//xmlns:ele1, '.'),         
    'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">   

Из-за // в substring-after он выберет первый ele1 относительно корневого элемента XML, а не тот, который относится к вашему текущему элементу. Вам, наверное, нужно это сделать

<xsl:element name="{translate(substring-after(ele1, '.'),         
    'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">  

Попробуйте этот шаблон вместо этого

<xsl:template match="//oldNode[contains(ele1, '.')]">            
    <xsl:element name="{translate(substring-after(//ele1, '.'),            
           'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">            
       <xsl:apply-templates select="@*|node()"/>            
    </xsl:element>            
</xsl:template>   

Точно так же для вашего второго набора шаблонов вы должны сделать что-то вроде этого

<xsl:template match="//oldNode[contains(ele1, '.jpeg')]"> 
05.06.2012
  • Простого использования contains() недостаточно. текст может быть: %02d.jpeg.tiff 07.06.2012

  • 2

    Вот тот же ответ, что и на ваш предыдущий вопрос — это полностью решает старую и текущую проблему и не использует рекурсию:

    <xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:my="my:my">
         <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
         <my:suffixes>
          <s>jpeg</s><s>JPEG</s>
          <s>tiff</s><s>TIFF</s>
          <s>giv</s><s>GIV</s>
          <s>png</s><s>PNG</s>
         </my:suffixes>
    
         <xsl:variable name="vSufs" select="document('')/*/my:suffixes/s"/>
    
         <xsl:template match="node()|@*" name="identity">
             <xsl:copy>
               <xsl:apply-templates select="node()|@*"/>
             </xsl:copy>
         </xsl:template>
    
         <xsl:template match="*">
           <xsl:variable name="vSufFound" select=
            "$vSufs[position() mod 2 = 1]
                 [substring(translate(current()/ele1, ., ''),
                            string-length(translate(current()/ele1, ., ''))
                            )
                 =
                  '.'
                 ]"/>
           <xsl:choose>
             <xsl:when test="not($vSufFound)">
              <xsl:call-template name="identity"/>
             </xsl:when>
             <xsl:otherwise>
               <xsl:element name="{$vSufFound/following-sibling::s[1]}">
                 <xsl:apply-templates select="node()|@*"/>
               </xsl:element>
             </xsl:otherwise>
           </xsl:choose>
         </xsl:template>
    </xsl:stylesheet>
    

    Когда это преобразование применяется к предоставленному XML-документу, создается желаемый правильный результат:

    <t>
        <JPEG userlabel="label1">
            <ele1>%02d.jpeg</ele1>
        </JPEG>
        <TIFF userlabel="label2">
            <ele1>%02d.tiff</ele1>
        </TIFF>
    </t>
    

    Пояснение:

    В этом преобразовании мы используем следующее выражение XPath 1.0 для реализации стандартной функции XPath 2.0 ends-with($t, $suf):

    $suf = substring($t, string-length($t) - string-length($suf) +1)
    
    07.06.2012

    3
  • Простого использования contains() недостаточно. текст может быть: %02d.jpeg.tiff 07.06.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..