2

そのままコピーしたいxmlがあります(xmlns=""とタグを確認してください。そのまま作成したい.

合計計算が行われます。この号のみ。それは有効です。それでもクライアントは、期待される形式がそのようであることを望んでいます。どんな助けでも大歓迎です。3 つのタスク

1) 名前空間 Employees xmnls="1.2" xmlns:xsi="3" xsi:schemalocation="4"> を追加する必要がある 2) 出力 xml ではなく、このようなタグを生成する 3) xmlns="" を避ける必要がある

事前にどんな助けでも大歓迎です rameshkumar singh

入力.xml

    <Employees>
            <employee>
             <dept>1</dept>
              <sec></sec>
            </employee>
            <employee>
               <dept>2</dept>
              <sec></sec>
            </employee>
    </Employees>

Expected.XML

         <Employees xmnls="1.2" xmlns:xsi="3" xsi:schemalocation="4">
            <totalemp>2</totalemp>
           <employee>
              <dept>1</dept>
              <sec></sec>
            <employee>
              <employee>
                   <dept>2</dept>
                    <sec></sec>
                 <employee>
              </Employees>


actual.XML
               <Employees>
                    <totalemp>2</totalemp>
                        <employee xmlns="">
                        <dept>1</dept>
                          <sec/>
                        </employee>
                         <employee>
                           <dept>2</dept>
                              <sec/>
                           <employee>
                 </Employees>
4

2 に答える 2

3

方法は次のとおりです。

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsi="3">

  <xsl:output indent="yes"/>

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

    <xsl:template match="*" priority="2">
        <xsl:element name="{local-name()}" namespace="1.2">
            <xsl:if test="self::Employees">
                <xsl:attribute name="xsi:schemalocation">4</xsl:attribute>          
            </xsl:if>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

恒等変換をデフォルトとして適用し、要素に対してそれをオーバーライドして、新しい名前空間とノードの特別な属性を与えEmployeesます。ステートメントを追加することを選択しましたifが、そのロジックを一致する別のテンプレートに移動することもできますEmployees。全部を2回繰り返したくありませんでしたxsl:element。本当に好みの問題。

この変換を入力ドキュメントに適用すると、次のようになります。

<Employees xmlns="1.2" xmlns:xsi="3" xsi:schemalocation="4">
    <employee>
        <dept>1</dept>
        <sec/>
    </employee>
    <employee>
        <dept>2</dept>
        <sec/>
    </employee>
</Employees>

その新しい名前空間ですべての要素を再作成していxmlns=""ないため、結果に が含まれている可能性があります。また、属性を追加できるようにするには、変換ドキュメントで名前空間xsi:schemalocationを宣言する必要があります。xsi

于 2012-05-16T22:36:46.337 に答える
0

この短くて単純な変換 (最小限の数のテンプレートを持ち、明示的な XSLT 条件付き命令を使用せず、xsl:attributeまたはpriority属性も使用しません):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="3" xsi:schemalocation="4">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="1.2">
   <xsl:copy-of select=
   "document('')/*[not(current()/../..)]
                        /@xsi:schemalocation"/>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<Employees>
    <employee>
        <dept>1</dept>
        <sec></sec>
    </employee>
    <employee>
        <dept>2</dept>
        <sec></sec>
    </employee>
</Employees>

必要な正しい結果が生成されます。

<Employees xmlns="1.2" xmlns:xsi="3" xsi:schemalocation="4">
   <employee>
      <dept>1</dept>
      <sec/>
   </employee>
   <employee>
      <dept>2</dept>
      <sec/>
   </employee>
</Employees>
于 2012-05-17T04:42:33.920 に答える