Пустой тег xml - добавить значение из другого тега с помощью xslt - PullRequest
0 голосов
/ 01 августа 2020

Я видел пример отсюда Как вставить тег XML после определенного тега с помощью XSLT? но это не совсем моя проблема.

У меня есть xml и в некоторых его тегах отсутствует значение, например:

<row>
    <title>The Outsider</title>
    <year>2018</year>
    <actors></actors> <!-- empty tag: add value "unknown" -->
    <actors>Tadanobu Asano</actors>
    <actors>Kippei Shîna</actors>
    <actors>Shioli Kutsuna</actors>
    <actors>Emile Hirsch</actors>
    <actors>Ray Nicholson</actors>
    <actors>Rory Cochrane</actors>
    <actors>Nao Ohmori</actors>
    <actors>Min Tanaka</actors>
    <actors>Masaki Miura</actors>
    <actors>Shun Sugata</actors>
    <actors>Hiroya Shimizu</actors>
    <actors>Hiro</actors>
    <actors>Young Dais</actors>
    <actors>Gô Jibiki</actors>
    <genre>Action</genre>
    <genre>Crime</genre>
    <genre>Drama</genre>
    <genre>Thriller</genre>
    <description/>      <!-- here is missing <description> -->
</row>

Я хочу добавить значение в тег.

Желаемый результат:

 <row>
        <title>The Outsider</title>
        <year>2018</year>
        <actors>Unknown</actors> <!-- add word "unknown" if tag is empty -->
        <actors>Tadanobu Asano</actors>
        <actors>Kippei Shîna</actors>
        <actors>Shioli Kutsuna</actors>
        <actors>Emile Hirsch</actors>
        <actors>Ray Nicholson</actors>
        <actors>Rory Cochrane</actors>
        <actors>Nao Ohmori</actors>
        <actors>Min Tanaka</actors>
        <actors>Masaki Miura</actors>
        <actors>Shun Sugata</actors>
        <actors>Hiroya Shimizu</actors>
        <actors>Hiro</actors>
        <actors>Young Dais</actors>
        <actors>Gô Jibiki</actors>
        <genre>Action</genre>
        <genre>Crime</genre>
        <genre>Drama</genre>
        <genre>Thriller</genre>
        <description>The Outsider<description/>  <!-- complete <description> with <title> value -->
    </row>

До сих пор я пробовал с этим:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

   <xsl:template match="node()|@*" name="ident">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>
 
      <xsl:template match="row[not(description)]">
        <xsl:copy>
                <xsl:apply-templates select="genre"/>
                    <description>
                      <xsl:value-of select="./title" />
                    </description>
                <xsl:apply-templates select="*[not(self::genre)]"/>
          </xsl:copy>
        </xsl:template>


</xsl:transform>

Но я не получаю то, что хочу, на выходе xml. Вы можете помочь мне? Спасибо.

1 Ответ

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

В заголовке написано «отсутствует тег», но в вашем примере показаны элементы пустые actor и description, а не отсутствующие . Если это единственная ситуация, с которой вам нужно справиться, вы можете просто:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

<xsl:template match="actors[not(text())]">
    <xsl:copy>Unknown</xsl:copy>
</xsl:template>

<xsl:template match="description[not(text())]">
    <xsl:copy>
        <xsl:value-of select="../title" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...