2014-10-30 2 views
0

Я столкнулся с проблемой при преобразовании ввода xml в oputput xml через xslt 2.0. Ниже входной XMLКак добавить несколько деклараций пространства имен в XSLT 2.0

<Heard sequence_id="10363284"> 
    <doctype>News</doctype> 
    <Banner>--Alert--</Banner> 
    <PCategory>WW</PCategory> 
    <Topic>XX,YY,ZZ</Topic> 
    <type>RealTime</type> 
    <headline>xxxxxxxxxxxxxxxxxx</headline> 
    <TextBody>xxxxxxxxx</TextBody> 
    <headline_datetime>2014-09-09T10:51:27-04:00</headline_datetime> 
    <service_line>ABC</service_line> 
    <page_num>123</page_num> 
</Heard> 

Выходной сигнал должен быть ожидаемый

<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:prl="http://prismstandard.org/namespaces/prl/2.0" xmlns:mgh="http://comp.com/prismPlus-XSD">   
    <mgh:article>  
     <mgh:head> 
      <dc:identifier>10363284</dc:identifier> 
      <dc:title>xxxxxxxxxxxxxxxxxx</dc:title> 
      <dc:publisher>Comp</dc:publisher> 
      <dc:subject>--Alert--</dc:subject> 
      <prism:publicationDate>09/08/2014</prism:publicationDate> 
      <prism:subsection1>News</prism:subsection1> 
      <prism:keyword>XX,YY,ZZ</prism:keyword> 
      <mgh:category>WW</mgh:category> 
      <mgh:serviceLine>ABC</mgh:serviceLine> 
      <mgh:pageNumber>123</mgh:pageNumber> 
     </mgh:head> 
     <mgh:contentFeatureBody> 
      <body> 
       xxxxxxxxxxxxxxxxxxxx 
      </body> 
     </mgh:newsFeatureBody>     
    </mgh:article>  
</mgh:message> 

В XSLT 2.0, как добавить несколько пространств имен, как постоянного тока, призмы, MGH? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, поскольку я довольно новичок в SO, и был бы очень признателен, если вы можете мне помочь.

ответ

2

Если вы создаете mgh:message как конечный элемент, то при условии, эти объявления пространства имен находятся в области видимости в соответствующем месте он должен просто работать:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" 
    xmlns:dc="http://purl.org/dc/elements/1.1" 
    xmlns:prl="http://prismstandard.org/namespaces/prl/2.0" 
    xmlns:mgh="http://comp.com/prismPlus-XSD"> 

    <xsl:template match="/"> 
    <mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd"> 
     <!-- etc --> 

С буквальных результата элементы сохраняют пространство имен, которые находятся в scope в этой точке таблицы стилей.

Вы могли бы, конечно, просто положить заявления на самом mgh:message элемента, а не на xsl:stylesheet, но если вы создаете dc:* элементов в другом шаблоне вам придется повторить xmlns:dc там. В целом, мне легче разместить все объявления в корне, если у вас нет особых причин.

+0

Спасибо за Ваш ответ. Хотя я пробовал ваш подход, добавив все объявления пространства имен в корневой каталог, все же он дает мне следующую ошибку при попытке выполнить преобразование. ** Пространство имен для префикса 'dc' не было объявлено ** –

+0

@PawanSaha жалуется на таблицу стилей или на входной XML-документ? Возможно, у вас есть '' элементы в _input_ без объявления 'xmlns: dc'? –

0

Не существует особой тайны для проецирования пространств имен и псевдонимов в выходные документы - как и с другими документами xml, объявлять их в корневом элементе, а затем использовать псевдонимы. AFAIK schemaLocation необходимо будет вручную сопоставить с корневым элементом в качестве атрибута. Вот основной шаблон скелет (обратите внимание, что я пропустил большинство элементов)

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" 
       xmlns:dc="http://purl.org/dc/elements/1.1" 
       xmlns:prl="http://prismstandard.org/namespaces/prl/2.0" 
       xmlns:mgh="http://comp.com/prismPlus-XSD"> 

    <xsl:template match="/Heard"> 
    <mgh:message> <!--OR of course <msh xmlns="...">--> 
     <xsl:attribute name="schemaLocation" 
         namespace="http://www.w3.org/2001/XMLSchema-instance" 
         >http://comp.com/prismPlus-XSD HeardsContent.xsd</xsl:attribute> 
     <mgh:article> 
     <mgh:head> 
      <dc:identifier> 
      <xsl:value-of select="some/path/to/value"></xsl:value-of> 
      </dc:identifier> 
      <prism:keyword> 
      <xsl:value-of select="Topic"></xsl:value-of> 
      </prism:keyword> 
     </mgh:head> 
     <mgh:contentFeatureBody> 
      <body> <!--Note, global namespace so no alias or xmlns--> 
      <xsl:value-of select="TextBody"></xsl:value-of> 
      </body> 
     </mgh:contentFeatureBody> 
     </mgh:article> 
    </mgh:message> 
    </xsl:template> 
</xsl:stylesheet> 

Это дает следующие выходные XML:

<?xml version="1.0" encoding="utf-8"?> 
<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd" 
      xmlns:mgh="http://comp.com/prismPlus-XSD" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" 
      xmlns:dc="http://purl.org/dc/elements/1.1" 
      xmlns:prl="http://prismstandard.org/namespaces/prl/2.0"> 
    <mgh:article> 
    <mgh:head> 
     <dc:identifier></dc:identifier> 
     <prism:keyword>XX,YY,ZZ</prism:keyword> 
    </mgh:head> 
    <mgh:contentFeatureBody> 
     <body>xxxxxxxxx</body> 
    </mgh:contentFeatureBody> 
    </mgh:article> 
</mgh:message> 
Смежные вопросы