2016-05-23 20 views
0

を追加します。 は、だから私は、単にそのようなコピーテンプレートを実行します。XSLTコピーテンプレートは、私は、次のXMLファイルを持って予想外の属性に

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "dtd/reference.dtd"> 
<reference xml:lang="en-us" id="D609" DTDVersion="V1.1.3" 
    domains="(topic ui-d) (topic hi-d) (topic pr-d) (topic sw-d) (topic ut-d)" 
    class="- topic/topic  reference/reference "> 
    <title class="- topic/title ">Body Text</title> 
    <shortdesc class="- topic/shortdesc ">A short desc.</shortdesc> 
    <prolog class="- topic/prolog "> 
     <metadata class="- topic/metadata "/> 
    </prolog> 
    <refbody class="- topic/body  reference/refbody "> 
     <section class="- topic/section "/> 
    </refbody> 
</reference> 

だから基本的に、私が手:

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


    <xsl:template match="/"> 

    <!-- Get the DOCTYPE comment --> 
    <xsl:variable name="d" 
     select="//comment()[contains(.,'DOCTYPE')][1]" /> 
    <xsl:variable name="doctype" select="substring($d,0)" /> 
    <xsl:message select="$doctype" /> 

    <!-- Output the DOCTYPE --> 
    <xsl:value-of disable-output-escaping="yes" select="$doctype" /> 

    <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="comment()[contains(text(),DOCTYPE)]"> 
    </xsl:template> 

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

、代わりに私がまったく同じ出力に含まになるように期待するものを得るのを、私はそれを取得しますすべての要素のクラス属性。私の趣味のタグも魔法のように(私に)作られたいくつかのタグで飾られています。

属性はどこから来ていますか?どうすればそれらを取り除くことができますか?

私はそれもコピーしようとするDTDやdoctypeに関係するかもしれないと思っていますが、わかりません。

+0

'reference.dtd'文書を表示できますか? –

+1

DTDは属性のデフォルト値を定義できます。 –

答えて

1

XSLTプロセッサへの入力はXMLパーサーに由来し、この入力の形式は(論理的に)詳細な形式がXDMデータモデルによって定義されたノードのツリーです。 XMLパーサーが(DTD内の要素と属性の定義によって駆動される)検証パーサーである場合、パーサによってXSLTエンジンに渡されるツリーには、一般に、ソースに明示的に存在する属性だけでなく、どのデフォルト値がDTDで定義されているかを示します。 XDMモデルは明示的属性と暗黙的属性を区別しないため、XSLTは両方とも同じ方法で処理します。

一部のXSLTプロセッサ(またはXMLパーサー)には、入力ツリーのXDMモデルからデフォルトの属性を除外するオプションがあります。たとえば、Saxonでは、コマンドラインから実行するときに-expand:offを使用するか、Javaまたは.NET API経由で実行するときに同様のオプションを使用してこれを実現できます。そのようなオプションがない場合は、おそらくDTDに対する入力の検証を避けることです。これを行う方法の詳細は、XMLパーサ/ XSLTプロセッサの組み合わせに依存します。

+0

こんにちはマイケル、詳細な答えをありがとう、今私は理解しています:)あなたは、このオプションを使用してコールでは、Saxonを実行している人のために: '<工場名=" net.sf.saxon.TransformerFactoryImpl ">' ' ' '' – Flag