2015-11-17 4 views
1

Я хочу, чтобы преобразовать данный ввод XML с помощью XSLT, и я хочу, чтобы исключить «XMLNS» атрибут корневого элемента из преобразованного выходногочтения XML-элемент, за исключением его атрибута с помощью XSLT

мой вклад XML является

<?xml version="1.0" encoding="ISO-8859-1"?> 

<library xmlns="https://support.bridgerinsight.lexisnexis.com/downloads/xsd/4.2/CWLEntityExport.xsd"> 
<book> 
    <title>Programming in C</title> 
    <author>Balagurusamy</author> 
    <country>India</country> 
    <price>165</price> 
    <year>1998</year> 
</book> 
<book> 
    <title>Professional ASP.NET 4 in C# and VB</title> 
    <author>Bill Evjen, Scott Hanselman, Devin Rader</author> 
    <country>USA</country> 
    <price>580</price> 
    <year>2010</year> 
</book> 
<book> 
    <title>Professional Microsoft SQL Server 2008 Programming</title> 
    <author>Robert Vieira</author> 
    <country>USA</country> 
    <price>520</price> 
    <year>2009</year> 
</book> 
<book> 
    <title>Professional LINQ</title> 
    <author>Scott Klein</author> 
    <country>USA</country> 
    <price>425</price> 
    <year>2008</year> 
</book> 
</library> 

и ожидаемый выход XML после преобразования с использованием XSLT следующим

<?xml version="1.0" encoding="UTF-8"?> 
<BookList> 
<Book> 
<title>Programming in C</title> 
<author>Balagurusamy</author> 
<country>India</country> 
</Book> 
<Book> 
<title>Professional ASP.NET 4 in C# and VB</title> 
<author>Bill Evjen, Scott Hanselman, Devin Rader</author> 
<country>USA</country> 
</Book> 

<Book> 
<title>Professional Microsoft SQL Server 2008 Programming</title> 
<author>Robert Vieira</author> 
<country>USA</country> 
</Book> 
<Book> 
<title>Professional LINQ</title> 
<author>Scott Klein</author> 
<country>USA</country> 
</Book> 

</BookList> 

мой XSLT является

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:template match="/"> 
    <BookList> 
     <xsl:for-each select="library/book"> 
     <Book> 

      <title> 
      <xsl:value-of select="title"/> 
      </title> 
      <author> 
      <xsl:value-of select="author"/> 
      </author> 
      <country> 
      <xsl:value-of select="country" /> 
      </country> 

     </Book> 
     </xsl:for-each> 
    </BookList> 
    </xsl:template> 
</xsl:stylesheet> 

Какие изменения мне нужно сделать в приведенном выше XSLT, чтобы получить заданный ожидаемый выход xml?

ответ

1

Я хочу, чтобы преобразовать данный ввод XML с помощью XSLT, и я хочу, чтобы исключить "Xmlns" атрибут корневого элемента из трансформированной выхода

мой ввод xml равен

<?xml version="1.0" encoding="ISO-8859-1"?> 

<library xmlns="https://support.bridgerinsight.lexisnexis.com/downloads/xsd/4.2/CWLEntityExport.xsd"> 
<book> 
    <title>Programming in C</title> 
. . . 

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

<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="*"> 
    <xsl:element name="{name()}"> 
     <xsl:copy-of select="namespace::*[name()]"/> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Обратите внимание, что пространство имен не должно быть объявлено в преобразовании и не требуется никакого конкретного выражения XPath!

Когда это преобразование применяется на прилагаемом документе XML (или, в общем, на любом документе пространства имен по умолчанию которого должно быть устранено), то захотел, правильный результат получается:

<?xml version="1.0" encoding="utf-8"?> 
<library> 
    <book> 
     <title>Programming in C</title> 
     <author>Balagurusamy</author> 
     <country>India</country> 
     <price>165</price> 
     <year>1998</year> 
    </book> 
    <book> 
     <title>Professional ASP.NET 4 in C# and VB</title> 
     <author>Bill Evjen, Scott Hanselman, Devin Rader</author> 
     <country>USA</country> 
     <price>580</price> 
     <year>2010</year> 
    </book> 
    <book> 
     <title>Professional Microsoft SQL Server 2008 Programming</title> 
     <author>Robert Vieira</author> 
     <country>USA</country> 
     <price>520</price> 
     <year>2009</year> 
    </book> 
    <book> 
     <title>Professional LINQ</title> 
     <author>Scott Klein</author> 
     <country>USA</country> 
     <price>425</price> 
     <year>2008</year> 
    </book> 
</library> 

Обновление:

Если в дополнение некоторые переименования элементов необходимо, преобразование становится:

<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="*"> 
    <xsl:element name="{name()}"> 
     <xsl:copy-of select="namespace::*[name()]"/> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="*[name()='library']"> 
    <BookList> 
     <xsl:apply-templates/> 
    </BookList> 
    </xsl:template> 

    <xsl:template match="*[name()='book']"> 
    <Book> 
     <xsl:apply-templates/> 
    </Book> 
    </xsl:template> 

    <xsl:template match="*[name()='price' or name()='year']"/> 
</xsl:stylesheet> 

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

<?xml version="1.0" encoding="utf-8"?> 
<BookList> 
    <Book> 
     <title>Programming in C</title> 
     <author>Balagurusamy</author> 
     <country>India</country> 
    </Book> 
    <Book> 
     <title>Professional ASP.NET 4 in C# and VB</title> 
     <author>Bill Evjen, Scott Hanselman, Devin Rader</author> 
     <country>USA</country> 
    </Book> 
    <Book> 
     <title>Professional Microsoft SQL Server 2008 Programming</title> 
     <author>Robert Vieira</author> 
     <country>USA</country> 
    </Book> 
    <Book> 
     <title>Professional LINQ</title> 
     <author>Scott Klein</author> 
     <country>USA</country> 
    </Book> 
</BookList> 
+0

Это не желаемый результат. –

+0

спасибо @Dimitre ваше решение работает отлично .. но, кроме того, я не хочу выбирать все элементы из ввода в преобразованный xml. Как вы можете видеть, я хочу исключить цену и год из ввода xml в конечном выпуске. Это может быть глупый вопрос :(но я никогда не работал над XSLT. –

+0

@DhirajKhodade, просто добавьте этот шаблон: '

2

Я хочу, чтобы исключить «Xmlns» атрибут корневого элемента из преобразованного выходного

Это не атрибут - это объявление пространства имен. Он помещает все элементы в ваш входной XML в пространство имен, связанное с объявленным URI.

Вам необходимо объявить это пространство имен в таблице стилей, назначить ему префикс и использовать этот префикс при обращении к элементам входного XML. Без этого ваши выражения XPath ничего не выберут.

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns1="https://support.bridgerinsight.lexisnexis.com/downloads/xsd/4.2/CWLEntityExport.xsd" 
exclude-result-prefixes="ns1"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/ns1:library"> 
    <BookList> 
     <xsl:for-each select="ns1:book"> 
      <Book> 
       <title> 
        <xsl:value-of select="ns1:title"/> 
       </title> 
       <author> 
        <xsl:value-of select="ns1:author"/> 
       </author> 
       <country> 
        <xsl:value-of select="ns1:country" /> 
       </country> 
      </Book> 
     </xsl:for-each> 
    </BookList> 
</xsl:template> 

</xsl:stylesheet> 
+0

благодаря майкл ур XSLT дает ожидаемый результат. мы можем сделать его более общим. bcoz Я не знаю, каким будет пространство имен во входном XML-файле. и в соответствии с ур ответом нам нужно указать те же xmlns в xslt. Итак, есть ли способ, который включает в себя те же xmlns в xslt, что и не требуется. ?? –

+1

@DhirajKhodade. Как возможно, что вы знаете структуру своего входного XML, но не используемое им пространство имен? Это не то, что должно измениться. –

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