0

NodeList からノードに 1 つの属性 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>

「属性値テンプレート」を使用してPublisher属性を作成することに注意してください。中括弧は、評価される式であることを示します。また、XSLTでも要素の名前を変更しているように見えるので、XSLTでもこれを行いました。(そうでない場合は、単にOrderLineRowに置き換えてください。

ここに完全な 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 に答える