重命名同一 XML 文档中名单中的节点

发布于 2024-11-27 02:20:11 字数 2367 浏览 0 评论 0原文

我有以下 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 次。现在,为了正确使用该结构,我必须首先在 中重命名 标记。 我想出了这个 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>

</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/>
    </Rows>
  </Table>
  </Tables>
  </Set>
</Data>

它看起来不错,但我的 元素始终为空。我缺少什么?

I have the following 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>

The element person can occur n-times. Now to properly work with that structure I have to rename the <C> tags first within <Person>.
I came up with this 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>

</xsl:stylesheet>

But the output is always this:

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

It looks fine but my <Person> element is always empty. What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

人事已非 2024-12-04 02:20:11

样式表

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

The following stylesheet

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

when applied to the input

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

outputs

<?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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文