2013-05-04 2 views
0

Мне был назначен новый проект, чтобы использовать таблицу стилей XSLT для преобразования одного XML-документа в другой формат XML.XSLT для XML-XML quandary

Я провел последние четыре часа, пробираясь через архивы на StackOverflow и в другом месте в Интернете, чтобы попытаться выяснить, как достичь желаемых результатов, но я ничего не могу найти, указывая на правильное направление.

Вот оригинальный формат документа:

<?xml version="1.0"?> 
<PODOrderSheet_Main> 
    <estimate> 
     <customer>LINFNC</customer> 
     <jobType>5020</jobType> 
     <JobParts> 
      <JobPart> 
       <jobPart>01</jobPart> 
       <contactNum/> 
       <JobNotes> 
        <JobNote> 
         <department>001</department> 
         <jobPart>01</jobPart> 
         <note><![CDATA[Rush Order]]></note> 
        </JobNote> 
       </JobNotes> 
      </JobPart> 
     </JobParts> 
    </estimate> 
    <estimate> 
     <customer>LINFNC</customer> 
     <jobType>5020</jobType> 
     <JobParts> 
      <JobPart> 
       <jobPart>01</jobPart> 
       <contactNum/> 
       <JobNotes> 
        <JobNote> 
         <department>001</department> 
         <jobPart>01</jobPart> 
         <note><![CDATA[Rush Order]]></note> 
        </JobNote> 
       </JobNotes> 
      </JobPart> 
     </JobParts> 
    </estimate> 
    <estimate> 
     <customer>LINFNC</customer> 
     <jobType>5020</jobType> 
     <JobParts> 
      <JobPart> 
       <jobPart>01</jobPart> 
       <contactNum/> 
       <JobNotes> 
        <JobNote> 
         <department>001</department> 
         <jobPart>01</jobPart> 
         <note><![CDATA[Rush Order]]></note> 
        </JobNote> 
       </JobNotes> 
      </JobPart> 
     </JobParts> 
    </estimate> 
</PODOrderSheet_Main> 

А вот как это должно выглядеть:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE estimate> 
<estimate> 
    <customer>LINFNC</customer> 
    <jobType>5020</jobType> 
    <JobParts> 
     <JobPart> 
      <jobPart>01</jobPart> 
      <contactNum/> 
      <JobNotes> 
       <JobNote> 
        <department>001</department> 
        <jobPart>01</jobPart> 
        <note><![CDATA[Rush Order]]></note> 
       </JobNote> 
      </JobNotes> 
     </JobPart> 
     <JobPart> 
      <jobPart>02</jobPart> 
      <contactNum/> 
      <JobNotes> 
       <JobNote> 
        <department>001</department> 
        <jobPart>02</jobPart> 
        <note><![CDATA[Rush Order]]></note> 
       </JobNote> 
      </JobNotes> 
     </JobPart> 
     <JobPart> 
      <jobPart>03</jobPart> 
      <contactNum/> 
      <JobNotes> 
       <JobNote> 
        <department>001</department> 
        <jobPart>03</jobPart> 
        <note><![CDATA[Rush Order]]></note> 
       </JobNote> 
      </JobNotes> 
     </JobPart> 
    </JobParts> 
</estimate> 

Я могу скопировать все элементы без каких-либо проблем. Где я застрял в том, что мне нужно только первое появление элементов customer и jobType, но все входящие JobParts из нескольких блоков estimate нумеруются правильно в порядке их падения в элементе jobPart.

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

+0

Это пример группировки проблемы, поэтому не должно быть слишком трудно решить. Используете ли вы XSLT1.0 или XSLT2.0, так как это имеет значение для решения проблемы? Кроме того, чтобы быть понятным, может ли клиент иметь разные элементы «jobType»? В таком случае, хотите ли вы, чтобы они группировались отдельно или вместе в одной группе? Благодаря! –

+0

Пример ввода не соответствует выходному. Например. на вашем входе нет '' и т. д. –

+0

Привет Тим. Спасибо за ответ. Это XSLT 1.0, и элемент jobType всегда будет тем, который был собран из первого блока оценки. –

ответ

0

Это не кажется мне проблемой группировки. Насколько я вижу, вам нужны только первые элементы customer и jobType, скопированные в начало вывода. После этого это всего лишь копия всех элементов JobPart. jobPartsmallj - отвратительный gotcha waiting there) элементы получают свой собственный шаблон для их номера в соответствии с содержащими JobPart элементами в исходных данных.

Это преобразование, кажется, делать то, что вам нужно

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

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="/PODOrderSheet_Main"> 
     <estimate> 
      <xsl:copy-of select="estimate[1]/customer"/> 
      <xsl:copy-of select="estimate[1]/jobType"/> 
      <JobParts> 
       <xsl:apply-templates select="estimate/JobParts/JobPart"/> 
      </JobParts> 
     </estimate> 
    </xsl:template> 

    <xsl:template match="jobPart"> 
     <xsl:copy><xsl:number count="JobPart" level="any" format="01"/></xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

выход

<?xml version="1.0" encoding="utf-8"?> 
<estimate> 
    <customer>LINFNC</customer> 
    <jobType>5020</jobType> 
    <JobParts> 
     <JobPart> 
     <jobPart>01</jobPart> 
     <contactNum/> 
     <JobNotes> 
      <JobNote> 
       <department>001</department> 
       <jobPart>01</jobPart> 
       <note>Rush Order</note> 
      </JobNote> 
     </JobNotes> 
     </JobPart> 
     <JobPart> 
     <jobPart>02</jobPart> 
     <contactNum/> 
     <JobNotes> 
      <JobNote> 
       <department>001</department> 
       <jobPart>02</jobPart> 
       <note>Rush Order</note> 
      </JobNote> 
     </JobNotes> 
     </JobPart> 
     <JobPart> 
     <jobPart>03</jobPart> 
     <contactNum/> 
     <JobNotes> 
      <JobNote> 
       <department>001</department> 
       <jobPart>03</jobPart> 
       <note>Rush Order</note> 
      </JobNote> 
     </JobNotes> 
     </JobPart> 
    </JobParts> 
</estimate> 
+0

Это работало блестяще. Спасибо за вашу помощь. Теперь я должен работать над добавлением и добавлением текстовых строк к некоторым скопированным значениям, но это дает мне долгий путь к моей цели. Еще раз спасибо за то, что нашли время, чтобы показать мне, как это сделать правильно. –

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