2016-03-21 3 views
0

回答にはXSLT 2.0または3.0を使用できます。私は名前空間を削除し、XMLノードを解析2.0 XSLTスタイルシートを持っているXMLへの文字列とxPathへの解析 - XSLT 2または3

<theRootNode xmlns="http://myNamespace"> 
    <xml> 
     &lt;Company&gt; 
      &lt;TaxIdentity&gt; 
       &lt;id/&gt; 
      &lt;/TaxIdentity&gt; 
      &lt;TaxIdentity&gt; 
       &lt;id&gt;42-123456&lt;/id&gt; 
      &lt;/TaxIdentity&gt; 
      &lt;Name&gt;ABC Company&lt;/Name&gt; 
      &lt;Number&gt;2230&lt;/Number&gt; 
     &lt;/Company&gt; 
    </xml> 
</theRootNode> 

:サクソンEEパーサ

は、XMLのサンプルを考えます。同じ変換の中で、私はちょうど解析したxmlノード内の空の値を持つ「TaxIdentity」ノードをすべて削除する必要があります。

現在の結果は以下のとおりです。

<theRootNode> 
    <xml> 
     <Company> 
      <TaxIdentity> 
       <id/> 
      </TaxIdentity> 
      <TaxIdentity> 
       <id>42-123456</id> 
      </TaxIdentity> 
      <Name>ABC Company</Name> 
      <Number>2230</Number> 
     </Company> 
    </xml> 
</theRootNode> 

望ましい結果は以下のとおりです。

<theRootNode> 
    <xml> 
     <Company> 
      <TaxIdentity> 
       <id>42-123456</id> 
      </TaxIdentity> 
      <Name>ABC Company</Name> 
      <Number>2230</Number> 
     </Company> 
    </xml> 
</theRootNode> 

私のXSLTは以下の通りです。注意したいのは、初期の結果を変数as = "element()またはparse-xml(version 3)を使用して置きますが、空のノードを削除することはできません。要素またはノード... TaxIdentiyという名前だけのもの。私はどのようなアプローチを取るべき?ソリューション?私は本当に同じ変換内ですべてを必要としています。ありがとうございました。ここで

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/> 
    <!-- Copy elements without copying their namespace declarations --> 
    <xsl:template match="*[not(local-name() = 'xml')]" name="identity"> 
     <xsl:element name="{name()}" namespace=""> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:element> 
    </xsl:template> 
    <!-- Copy content as is with lower priority --> 
    <xsl:template match="node() | @*" priority="-2"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- turn xml node content back into xml --> 
    <xsl:template match="*[local-name() = 'xml']"> 
     <xsl:element name="xml" inherit-namespaces="no" namespace=""> 
      <xsl:value-of select="." disable-output-escaping='yes'/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

答えて

1

は単純でXMLを解析し、私のXSLT 3.0の提案ですparse-xmlして、すべての空の子要素でTaxIdentityを削除するテンプレートを使用して解析されたノードに、テンプレートを適用:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    xmlns:is="http://myNamespace" 
    exclude-result-prefixes="is xs math" 
    version="3.0"> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:template match="is:*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@* , node()"></xsl:apply-templates> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="is:xml"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="parse-xml(.)/node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="TaxIdentity[not(*[normalize-space()])]"/> 

</xsl:stylesheet> 
+0

ありがとうそれWOR! ks、私はまだ技術を解読しています。 – johkar

+0

''はXSLT 3.0の2番目のテンプレートを置き換えます。そして、空の '

関連する問題