2017-09-15 27 views
0

xmlファイルがあり、ネームスペースの受信プレフィックスを置き換えずにタグの1つを置き換える必要があります。例えば、以下のXMLの場合:XSLTを使用してxmlタグを置換する

<f:table xmlns:f="https://www.test.com"> 
  <f:name>Peter</f:name> 
  <f:lname>Jenkins</f:lname> 
  <f:height>71</f:height> 
</f:table> 

私はlnameをlastnameに置き換えても、接頭辞(この場合はf)をそのまま維持する必要があります。望ましい出力は以下のようになります。プレフィックスはそれが常に

<f:table xmlns:f="https://www.test.com"> 
  <f:name>Peter</f:name> 
  <f:lastname>Jenkins</f:lastname> 
  <f:height>71</f:height> 
</f:table> 

fとされることはありません、私はXSLTの下で試してみましたが、これは完全なオリジナルの接頭辞なし姓でLNAMEに代わる変更できます。助けてください

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="table/lname"> 
     <lastname><xsl:apply-templates select="@*|node()" /></lastname> 
    </xsl:template> 
</xsl:stylesheet> 

答えて

0

接頭辞は意味を持ちません。次のスタイルシート:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns0="https://www.test.com"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="ns0:lname"> 
    <ns0:lastname> 
     <xsl:apply-templates/> 
    </ns0:lastname> 
</xsl:template> 

</xsl:stylesheet> 

ご入力の例に適用される、戻ります:

<?xml version="1.0" encoding="UTF-8"?> 
<f:table xmlns:f="https://www.test.com"> 
    <f:name>Peter</f:name> 
    <ns0:lastname xmlns:ns0="https://www.test.com">Jenkins</ns0:lastname> 
    <f:height>71</f:height> 
</f:table> 

あなたの質問に示す出力と意味的に同一です。


あなたは本当にあなたが行うことができ、元の接頭辞を維持する必要があるいくつかの理由であれば:

<xsl:template match="ns0:lname"> 
    <xsl:variable name="uri" select="'https://www.test.com'" /> 
    <xsl:variable name="prefix" select="name(namespace::*[.=$uri])" /> 
    <xsl:element name="{$prefix}:lastname" namespace="{$uri}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
+0

ありがとうございました!それはトリックをした –

関連する問題