0

我必须从 NodeList 向节点添加一个属性 Publisher="Penguin" :输入 xml 如下所示:

    <Rack RackNo="1">
    <Rows>
    <Row RowNo="1" NoOfBooks="10"/>
    <Row RowNo="2" NoOfBooks="15"/>
    <Rows>
    </Rack>

输出 xml 如下所示:

   <Rack RackNo="1">
    <Rows>
    <Row RowNo="1" NoOfBooks="10" Publisher="Penguin"/>
    <Row RowNo="2" NoOfBooks="15" Publisher="Penguin"/>
    <Rows>
    </Rack>

我写的 xsl 是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes" />
   <xsl:template match="/">
        <Order>
            <xsl:copy-of select = "Rack/@*"/>
                <xsl:for-each select="Rows/Row">
                    <OrderLine>
                        <xsl:copy-of select = "Row/@*"/>
        <xsl:attribute name="Publisher"></xsl:attribute>
                        <xsl:copy-of select = "Row/*"/>
                    </OrderLine>
                </xsl:for-each>
            <xsl:copy-of select = "Rack/*"/>
        </Order>
 </xsl:template>
</xsl:stylesheet>

这不会返回所需的输出。任何帮助都感激不尽。

提前谢谢各位。

4

1 回答 1

0

这是 XSLT 身份转换的工作。就其本身而言,它可以简单地创建输入 XML 中所有节点的副本

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

您需要做的就是添加一个额外的模板来匹配Row元素,并为其添加一个Publisher属性。最好先参数化您要添加的发布者

<xsl:param name="publisher" select="'Penguin'" />

然后按如下方式创建匹配模板:

<xsl:template match="Row">
   <OrderLine Publisher="{$publisher}">
      <xsl:apply-templates select="@*|node()"/>
   </OrderLine>
</xsl:template>

请注意使用“属性值模板”来创建发布者属性。花括号表示它是一个要计算的表达式。另请注意,在您的 XSLT 中,您似乎也在重命名元素,所以我也在我的 XSLT 中这样做了。(如果不是这种情况,只需将OrderLine替换为Row

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:param name="publisher" select="'Penguin'" />

   <xsl:template match="Rack">
      <Order>
         <xsl:apply-templates />
      </Order>
   </xsl:template>

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

   <xsl:template match="Row">
      <OrderLine Publisher="{$publisher}">
         <xsl:apply-templates select="@*|node()"/>
      </OrderLine>
   </xsl:template>

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

当应用于您的 XML 时,将输出以下内容

<Order>
   <OrderLine Publisher="Penguin" RowNo="1" NoOfBooks="10"></OrderLine>
   <OrderLine Publisher="Penguin" RowNo="2" NoOfBooks="15"></OrderLine>
</Order>
于 2013-01-07T08:51:38.373 回答