Что нужно в XSLT для добавления отсутствующего элемента XML? - PullRequest
4 голосов
/ 30 марта 2012

Я пытаюсь преобразовать файл XML в обновленную версию.

У меня есть следующий исходный XML

<?xml version="1.0" encoding="utf-8" ?>
<config>
  <section name="abc">
    <key name="key1">My Key One</key>
  </section>
  <section name="def">
    <key name="key2">My Key Two</key>
  </section>
</config>

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

<?xml version="1.0" encoding="utf-8" ?>
<config>
  <section name="abc">
    <key name="key1">My Key One</key>
  </section>
  <section name="def">
    <key name="key2">My Key Two</key>
  </section>
  <section name="xyz">
    <key name="key3">My Key Three</key>
  </section>
</config>

XSLT в настоящее время выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="config">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>

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

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

</xsl:stylesheet>

Это похоже на то, что копирует,Как заставить его добавить свой отсутствующий элемент, если он на самом деле отсутствует?

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Попробуйте что-то вроде этого:

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

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

  <xsl:template match="config">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
      <xsl:if test="not(section/@name='xyz')">
        <section name="xyz">
          <key name="key3">My Key Three</key>
        </section>
      </xsl:if>
    </xsl:copy>    
  </xsl:template>

</xsl:stylesheet>
2 голосов
/ 31 марта 2012

Короче и проще (без явных условных инструкций) :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="config[not(section[@name = 'xyz'])]">
  <config>
   <xsl:apply-templates select="node()|@*"/>
   <section name="xyz">
     <key name="key3">My Key Three</key>
   </section>
  </config>
 </xsl:template>
</xsl:stylesheet>

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

<config>
    <section name="abc">
        <key name="key1">My Key One</key>
    </section>
    <section name="def">
        <key name="key2">My Key Two</key>
    </section>
</config>

желаемый, правильный результат (добавлен новый section):

<config>
   <section name="abc">
      <key name="key1">My Key One</key>
   </section>
   <section name="def">
      <key name="key2">My Key Two</key>
   </section>
   <section name="xyz">
      <key name="key3">My Key Three</key>
   </section>
</config>

при применении к этому документу XML :

<config>
   <section name="abc">
      <key name="key1">My Key One</key>
   </section>
   <section name="def">
      <key name="key2">My Key Two</key>
   </section>
   <section name="xyz">
      <key name="key3">My Key Three</key>
   </section>
</config>

снова выдается желаемый результат (новый раздел не добавлен, поскольку он уже существует):

<config>
   <section name="abc">
      <key name="key1">My Key One</key>
   </section>
   <section name="def">
      <key name="key2">My Key Two</key>
   </section>
   <section name="xyz">
      <key name="key3">My Key Three</key>
   </section>
</config>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...