2011-07-31 5 views
1

У меня есть следующий XML:Переименовать узлы из списка имен в этом же документе XML

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
    <Set> 
<Tables> 
    <Table> 
    <Tablehead> 
     <C>Name</C> 
     <C>FirstName</C> 
     <C>Address</C> 
     <C>Zip</C> 
     <C>City</C> 
     <C>State</C> 
    </Tablehead> 
    <Rows> 
     <Person> 
     <C>Miller</C> 
     <C>John</C> 
     <C>Squires Circle</C> 
     <C>88034</C> 
     <C>Boulder</C> 
     <C>Colorado</C> 
     </Person> 
    </Rows> 
    </Table> 
    </Tables> 
    </Set> 
</Data> 

Элемента человек может возникнуть п раз. Теперь, чтобы правильно работать с этой структурой, я должен переименовать теги <C> сначала в пределах <Person>. я придумал этот XSL:

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

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

<xsl:template match="Rows"> 
    <Rows>  
     <xsl:apply-templates select="Person"/> 
    </Rows> 
</xsl:template> 

<xsl:template match="Person"> 
    <Person> 
     <xsl:apply-templates select="C"/>      
    </Person> 
</xsl:template> 

<xsl:template match="/Data/Set/Tables/Table/Rows/Person/C"> 
    <xsl:variable name="nodePosition" select="position()" /> 
     <xsl:value-of select="parent::*/parent::*/parent::*/Tablehead/C[$nodePosition]"/> 
</xsl:template> 

Но выход всегда так:

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
    <Set> 
    <Tables> 
    <Table> 
    <Tablehead> 
     <C>Name</C> 
     <C>FirstName</C> 
     <C>Address</C> 
     <C>Zip</C> 
     <C>City</C> 
     <C>State</C> 
    </Tablehead> 
    <Rows> 
     <Person/> 
    </Rows> 
    </Table> 
    </Tables> 
    </Set> 
</Data> 

Это выглядит хорошо, но мой <Person> элемент всегда пуст. Что мне не хватает? Я пробовал, но я не могу заставить его работать. Я рад любым идеям с вашей стороны. Спасибо и наилучшими пожеланиями, Питер

+0

Здравствуйте, mzjn, Извините. Теперь я исправил свой XSLT, чтобы он соответствовал -tags. – Peter

ответ

2

Следующая таблица стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

<xsl:template match="Person/C"> 
    <xsl:variable name="index"> 
     <xsl:number/> 
    </xsl:variable> 
    <xsl:element name="{../../../Tablehead/C[position() = $index]}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

при подаче на вход

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
    <Set> 
<Tables> 
    <Table> 
    <Tablehead> 
     <C>Name</C> 
     <C>FirstName</C> 
     <C>Address</C> 
     <C>Zip</C> 
     <C>City</C> 
     <C>State</C> 
    </Tablehead> 
    <Rows> 
     <Person> 
     <C>Miller</C> 
     <C>John</C> 
     <C>Squires Circle</C> 
     <C>88034</C> 
     <C>Boulder</C> 
     <C>Colorado</C> 
     </Person> 
    </Rows> 
    </Table> 
    </Tables> 
    </Set> 
</Data> 

выходы

<?xml version="1.0" encoding="UTF-8"?><Data> 
    <Set> 
<Tables> 
    <Table> 
    <Tablehead> 
     <C>Name</C> 
     <C>FirstName</C> 
     <C>Address</C> 
     <C>Zip</C> 
     <C>City</C> 
     <C>State</C> 
    </Tablehead> 
    <Rows> 
     <Person> 
     <Name>Miller</Name> 
     <FirstName>John</FirstName> 
     <Address>Squires Circle</Address> 
     <Zip>88034</Zip> 
     <City>Boulder</City> 
     <State>Colorado</State> 
     </Person> 
    </Rows> 
    </Table> 
    </Tables> 
    </Set> 
</Data> 

Надежда, что помогает.

+0

Спасибо, Мартин, Ваше решение работает отлично. Извините за мое несоответствие C и A в моем XML/XSLT. Я также пробовал его в большом файле, и он работал. Благодарим вас за помощь - это выглядит так просто. Я постараюсь понять это. С наилучшими пожеланиями, Питер – Peter

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