Как заменить результат шаблона другим разделом XML

Использование этого XML

<!DOCTYPE ADI SYSTEM "ADI.DTD">
<ADI>
<Asset>
<Metadata>
<AMS Asset_Class="title" Asset_ID="HSHT2344862006150001" Asset_Name="HSHT2344862006150001_ALON_HD" Creation_Date="2020-07-07" Description="Alone-title" Product="SVOD" Verb="" Version_Major="1" Version_Minor="0"/>
<App_Data App="MOD" Name="Type" Value="title"/>
<App_Data App="MOD" Name="Title" Value="Alone S7 Ep02 HD"/>
<App_Data App="MOD" Name="Title_Brief" Value="Alone S7 Ep02 HD"/>
<App_Data App="MOD" Name="Category" Value="History/Alone"/>
<App_Data App="MOD" Name="Category" Value="TV Shows/History/Alone"/>
</Metadata>
</Asset>
</ADI>

Я пытаюсь выполнить три вещи в преобразовании XSLT.

  1. Возьмите одно из значений категории в App_Data и извлеките строку после последней /
  2. Замените значения Title и Title_Brief полученной строкой.
  3. Удалите строки категории

Я смог изменить строки категории до строки, которую я хочу заменить в значениях Title и Title_Brief, используя совет из этого поста, однако мой результат заменяет только обе строки категории.

Это мой XSLT


<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output encoding="UTF-8" doctype-system="ADI.DTD" method="xml" indent="yes"/>

<xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
 </xsl:template>

  <xsl:template name="substring-after-last">
    <xsl:param name="string"/>
    <xsl:param name="char"/>
    <xsl:choose>
      <xsl:when test="contains($string, $char)">
        <xsl:call-template name="substring-after-last">
          <xsl:with-param name="string" select="substring-after($string, $char)"/>
          <xsl:with-param name="char" select="$char"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$string"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="/ADI/Asset/Metadata/App_Data[@Name='Category']">
        <xsl:call-template name="substring-after-last">
          <xsl:with-param name="string" select="@Value"/>
          <xsl:with-param name="char" select="'/'"/>
        </xsl:call-template>
  </xsl:template>

</xsl:transform>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ADI
  SYSTEM "ADI.DTD">
<ADI>
   <Asset>
      <Metadata>
         <AMS Asset_Class="title"
              Asset_ID="HSHT2344862006150001"
              Asset_Name="HSHT2344862006150001_ALON_HD"
              Creation_Date="2020-07-07"
              Description="Alone-title"
              Product="SVOD"
              Verb=""
              Version_Major="1"
              Version_Minor="0"/>
         <App_Data App="MOD" Name="Type" Value="title"/>
         <App_Data App="MOD" Name="Title" Value="Alone S7 Ep02 HD"/>
         <App_Data App="MOD" Name="Title_Brief" Value="Alone S7 Ep02 HD"/>
Alone
Alone
</Metadata>
   </Asset>
</ADI>

person Tim Potter    schedule 17.12.2020    source источник


Ответы (1)


xsl:attribute позволил мне выполнить мой результат, поэтому последний шаблон выглядит так:

 <xsl:template match="/ADI/Asset/Metadata/App_Data[@Name='Category']">
    <App_Data App="{@App}" Name="Title">    
      <xsl:attribute name="Value">
        <xsl:call-template name="substring-after-last">
          <xsl:with-param name="string" select="@Value"/>
          <xsl:with-param name="char" select="'/'"/>
        </xsl:call-template>
      </xsl:attribute>
    </App_Data>
  </xsl:template>

Также удаление оригинального Title и Title_Brief с помощью

 <xsl:template
    match="/ADI/Asset/Metadata/App_Data[@Name='Title' or @Name='Title_Brief'">
  </xsl:template>
person Tim Potter    schedule 17.12.2020