Вставить узлы в выборочной копии в XSLT - PullRequest
1 голос
/ 03 ноября 2010

Я отфильтровываю определенные узлы в своем преобразовании XSLT, и среди оставшихся мне нужно вставить элемент, если определенный подэлемент отсутствует.

Вот что у меня есть.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" >
<xsl:output method="xml" indent="yes"/>

  <xsl:template xpath-default-namespace="http://www.tempuri.org" match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template xpath-default-namespace="http://www.tempuri.org" match="SomeNode">
  </xsl:template>
  <xsl:template xpath-default-namespace="http://www.tempuri.org" match="TheNode[@type!='SomeType' and @type!='OtherType']">

<!-- If TheNode is missing a child element SomeElement, insert a blank SomeElement element -->

  </xsl:template>

</xsl:stylesheet>

Может кто-нибудь предложить лучший способ сделать это, пожалуйста?

Спасибо.

1 Ответ

3 голосов
/ 03 ноября 2010

Это преобразование :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xpath-default-namespace="http://www.tempuri.org" >
 <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="SomeNode">
  </xsl:template>
  <xsl:template match=
      "TheNode[not(@type = ('SomeType','OtherType')) and not(SomeElement)]">
    <xsl:copy>
     <xsl:apply-templates select="@*"/>
     <SomeElement xmlns="http://www.tempuri.org"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

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

<t xmlns="http://www.tempuri.org">
 <a>
  <b/>
  <SomeNode/>
  <TheNode type="x"/>
  <TheNode type="y">
   <SomeElement/>
  </TheNode>
 </a>
</t>

создает искомое значение,правильный результат :

<t xmlns="http://www.tempuri.org">
   <a>
      <b/>
      <TheNode type="x">
         <SomeElement/>
      </TheNode>
      <TheNode type="y">
         <SomeElement/>
      </TheNode>
   </a>
</t>
...