2010-11-02 5 views
0

У меня есть документ XML, который имеет дополнительные узлы в нем на разных уровнях, которые я хочу удалить с помощью XSLT.Какой простой способ обрезать значения из XML

Моя интуиция - это генерация XSD (с использованием Altova или тому подобного), удаление элементов, которые я не хочу отображать на моем выходе, а затем позволить редактору (Altova или тому подобное) генерировать XSLT для преобразования старый XSD в новый XSD.

В тот же день я писал XSL для этого вручную ... но со всеми этими классными инструментами действительно есть причина или может предложить альтернативный способ? Я не сделал этот материал в течение нескольких лет, так что я понял, я хотел бы спросить ...

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

<?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']"> 
    </xsl:template> 

</xsl:stylesheet> 

Единственное, что мне нужно сделать, это проверить отсутствующий элемент «SomeSubElement» в «TheNode» и вставить пустой элемент, если он отсутствует.

Любые предложения о том, как это сделать? Благодарю.

+0

Насколько причины идти, это, вероятно, быстрее, чтобы написать XSLT, чем XSD ... – annakata

+0

Во-первых, это другой вопрос. Вы должны спросить еще раз. Во-вторых, это не способ иметь дело с QNames: поместите только один «xpath-default-namespace =» http://www.tempuri.org »в корневой элемент« styleheet »или поместите объявление пространства имен« xmlns » : temp = "http://www.tempuri.org" 'в корневом элементе' stylesheet' и использовать полное QName в шаблонах, например 'temp: SomeNode' – 2010-11-02 21:32:08

ответ

3

Простое тождественное преобразование с пустыми шаблонами для того, что вы хотите отказаться:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="2.0"> 

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

    <xsl:template match="tagToBeRemoved"/> 

</xsl:stylesheet> 
+0

Мне кажется, что мои теги не удаляются, чтобы быть уважал. У меня есть . Я также пробовал как . Спасибо за помощь! – Jeff

+0

@ JeffN825: Если у вас все еще есть трудности, отредактируйте сообщение, чтобы добавить образец XML-данных и пустые шаблоны в XSLT, которые не работают. –

+0

@ JeffN825: Может быть, есть некоторые объявления пространства имен? – 2010-11-02 20:49:46