XSLT: как развернуть дочерний элемент, чтобы иметь дополнительный родительский элемент - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь преобразовать XML в другой файл XML, но безуспешно превращаю плоский элемент в расширенный элемент.

Выходные данные должны быть идентичны, за исключением того, что DateOfBirth следует изменить на:

<DateOfBirth>
  <FullDate xmlns="cds_dt">1966-02-11</FullDate>
</DateOfBirth>

Вот входные файлы, которые я использую:

Input
*****
<?xml version="1.0" encoding="utf-8"?>
<RootRec xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="cds">
  <MyRecord>
    <Demographics>
      <Names>
        <LegalName namePurpose="L" xmlns="cds_dt">
          <FirstName>
            <Part>Jason</Part>
            <PartType>GIV</PartType>
          </FirstName>
          <LastName>
            <Part>Smith</Part>
            <PartType>FAMC</PartType>
          </LastName>
          <OtherName>
            <Part>Lauren</Part>
            <PartType>GIV</PartType>
          </OtherName>
        </LegalName>
      </Names>
      <DateOfBirth>1966-02-11</DateOfBirth>
    <Demographics>
  <MyRecord>    
</RootRec>


XSL file
********
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  <xsl:output indent="yes"/> 
  <xsl:strip-space elements="*"/> 

  <!--Identity Template. This will copy everything as-is.--> 
  <xsl:template match="node()|@*"> 
    <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
  </xsl:template> 

 <!--expand "DateOfBirth" element to /DateOfBirth/FullDate element.--> 
  <xsl:template match="RootRec/MyRecord/Demographics/DateOfBirth"> 
    <DateOfBirth> 
      <FullDate><xsl:value-of select="DateOfBirth"/></FullDate>
    </DateOfBirth> 
  </xsl:template> 
</xsl:stylesheet>

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="cds">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="x:DateOfBirth/text()">
  <xsl:element name="FullDate" xmlns="cds_dt"><xsl:value-of select="."/></xsl:element>
 </xsl:template>
</xsl:stylesheet>

применительно к предоставленному (исправленному, чтобы сделать правильно) XML-документу :

<RootRec
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="cds">
    <MyRecord>
        <Demographics>
            <Names>
                <LegalName namePurpose="L" xmlns="cds_dt">
                    <FirstName>
                        <Part>Jason</Part>
                        <PartType>GIV</PartType>
                    </FirstName>
                    <LastName>
                        <Part>Smith</Part>
                        <PartType>FAMC</PartType>
                    </LastName>
                    <OtherName>
                        <Part>Lauren</Part>
                        <PartType>GIV</PartType>
                    </OtherName>
                </LegalName>
            </Names>
            <DateOfBirth>1966-02-11</DateOfBirth>
        </Demographics>
    </MyRecord>
</RootRec>

дает требуемый, правильный результат :

<RootRec xmlns="cds" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <MyRecord>
      <Demographics>
         <Names>
            <LegalName xmlns="cds_dt" namePurpose="L">
               <FirstName>
                  <Part>Jason</Part>
                  <PartType>GIV</PartType>
               </FirstName>
               <LastName>
                  <Part>Smith</Part>
                  <PartType>FAMC</PartType>
               </LastName>
               <OtherName>
                  <Part>Lauren</Part>
                  <PartType>GIV</PartType>
               </OtherName>
            </LegalName>
         </Names>
         <DateOfBirth>
            <FullDate xmlns="cds_dt">1966-02-11</FullDate>
         </DateOfBirth>
      </Demographics>
   </MyRecord>
</RootRec>

Объяснение : переопределение правила идентификации .

0 голосов
/ 03 марта 2012

Это должно быть

<FullDate><xsl:value-of select="."/></FullDate>

, так как вы уже выбираете DateOfBirth в match=""

В трех закрывающих тегах до конца документа также отсутствует /и имена вашего пространства имен недопустимы, поскольку они должны быть абсолютными URI.

Удачи.

...