XSLT中的外部脚本

时间:2015-08-13 05:34:47

标签: perl xslt

我有以下XML文件,如何在XSLT中调用perl脚本。因为我想更新每个entry的ID。例如<entry id="5">和下一个条目应该是<entry id="10">

我的XML是:

<feed>
  <author> 
    <firstName>f</firstName>
    <lastName>l</lastName>
  </author>
  <date>2011-01-02 </date>
  <entry>
    <id>1</id>
    <Name>aaa</Name>
    <Content>XXX</Content>     
  </entry>
  <entry>
    <id>2</id>
    <Name>bbb</Name>
    <Content>YYY</Content>   
  </entry>
</feed>

我的XSLT是:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="updateItems" select="feed/entry" />
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="feed">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()[not(self::entry)] | entry[not(id = $updateItems/id)]" />
      <xsl:apply-templates select="$updateItems" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

首先,我不认为可以调用Perl脚本来处理来自XSLT的XML数据。如果您使用Saxon(我认为您使用的是XSLT 2.0),您可以使用Java类。

但是,如果我的要求正确,则无需使用外部编程语言。据我了解,您只想通过将它们乘以5来更改您的ID。因此,我建议您这样做:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="id">
        <xsl:copy><xsl:value-of select=". * 5"/></xsl:copy>
    </xsl:template>

</xsl:stylesheet>

此脚本不会触及除id - 元素的文本值之外的任何内容 - 乘以5.即可。