2016-07-27 2 views
0

Оригинал ЗапросИзвлечение элементы между узлом = XSLT

<?xml version="1.0" encoding="utf-8"?> 
<typ:CustomerResponse xmlns:typ="http://xml.mycomp.com/customer/types"> 
<typ:CustomerReturn> 
    <typ:Address> 
     <typ:state>PA</typ:state> 
     <typ:city>Harrisburg</typ:city> 
    </typ:Address> 
    <typ:User> 
     <typ:firstName>test</typ:firstName> 
     <typ:lastName>test</typ:lastName> 
    </typ:User> 
</typ:CustomerReturn> 
</typ:CustomerResponse> 

Я удалил Пространства имен XML с помощью XSLT. Ниже

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name(.)}"> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name(.)}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 
    <xsl:template match="@xsi:nil[.='true']"/> 

</xsl:stylesheet> 

После выполнения выше преобразований на моем первоначально XML, который имеет пространство имен я получаю ниже -

<?xml version="1.0" encoding="utf-8"?> 
<CustomerResponse> 
<CustomerReturn> 
    <Address> 
     <state>PA</state> 
     <city>Harrisburg</city> 
    </Address> 
    <User> 
     <firstName>test</firstName> 
     <lastName>test</lastName> 
    </User> 
</CustomerReturn> 
</CustomerResponse> 

Я хочу, чтобы увеличить существующий файл XSLT, чтобы получить результат, аналогичный ниже.

Ожидаемый результат

<CustomerResponse> 
     <Address> 
      <state>PA</state> 
      <city>Harrisburg</city> 
     </Address> 
     <User> 
      <firstName>test</firstName> 
      <lastName>test</lastName> 
     </User> 
</CustomerResponse> 
+0

Ваш вопрос не ясен. Пожалуйста, покажите исходный входной XML и ожидаемый результат преобразования. –

+0

Привет, Майкл, добавил ожидаемый результат. –

+1

Пожалуйста, покажите нам оригинальный вход. - Знаете ли вы, что нужный результат не является хорошо сформированным XML? –

ответ

2

Попробуйте это так?

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:typ="http://xml.mycomp.com/customer/types" 
exclude-result-prefixes="typ"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="typ:CustomerReturn"> 
    <xsl:apply-templates/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо, работы потрясающие. Большое спасибо. Можно ли объяснить, что делается? –

+0

Первый шаблон создает соответствующий элемент в no-namespace для каждого элемента исходного XML. Он делает это рекурсивно, пересекая все дерево от корня до листьев. Второй шаблон переопределяет для 'typ: CustomerReturn': он продолжает рекурсию (вызывая' '), но пропускает создание соответствующего элемента для текущего узла. Таким образом, дети типа «typ: CustomerReturn» перемещаются вверх по иерархии и становятся дочерними элементами «CustomerResponse». - См. Также: https://www.w3.org/TR/xslt/#section-Processing-Model –

+0

Большое спасибо, Майкл! –