2010-11-02 4 views
1

Я отфильтровываю определенные узлы в своем преобразовании XSLT, а среди оставшихся мне нужно вставить элемент, если отсутствует какой-то дополнительный элемент.Вставлять узлы в выборочное копирование в 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> 

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

Спасибо.

+0

Хороший вопрос, +1. См. Мой ответ для полного и короткого решения. :) –

ответ

3

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

<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> 
+0

+1 Хороший ответ. – 2010-11-02 22:28:07

+0

Уход. Я большой поклонник использования шаблонов с предикатами в матче. Делает для очень простых таблиц стилей. –

+0

@Nic: Да, это полная мощность XSLT. –

Смежные вопросы