Переименование узлов из списка имен в том же документе XML - PullRequest
1 голос
/ 31 июля 2011

У меня есть следующий 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>

Элемент person может встречаться n раз. Теперь, чтобы правильно работать с этой структурой, мне нужно сначала переименовать теги <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> всегда пуст. Что мне не хватает? Я пытался, но не могу заставить его работать. Я рад любым идеям с вашей стороны. Спасибо и наилучшими пожеланиями, Питер

1 Ответ

2 голосов
/ 31 июля 2011

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

<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>

output

<?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>

Надеюсь, это поможет.

...