2017-10-19 12 views
0

「選択」を使用してノードが存在するかどうかを確認し、その中のテキストを抽出したいと思います。そうでない場合は、文字列を挿入する必要があります。この例ではノードの存在を選択するXSLT

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" 
xmlns:gmd="http://www.isotc211.org/2005/gmd" 
xmlns:gts="http://www.isotc211.org/2005/gts" 
xmlns:gco="http://www.isotc211.org/2005/gco" 
xmlns:gml="http://www.opengis.net/gml" 
xmlns:geonet="http://www.fao.org/geonetwork"> 
<xsl:output method="text" encoding="utf-8" /> 

<!-- identity templates walks tree and suppresses nodes with no template --> 
<xsl:template match="node()|@*"> 
     <xsl:apply-templates select="node()|@*"/> 
</xsl:template> 

<!-- output only on nodes we select --> 
<xsl:template match="node()|@*" mode="output"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" mode="output"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="gmd:pointOfContact/gmd:CI_ResponsibleParty"> 
<xsl:choose> 
     <xsl:when test="gmd:individualName/gco:CharacterString">  
       <xsl:text>Responsible: </xsl:text> 
       <xsl:apply-templates mode="output"/> 
       <xsl:text>;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>NO Responsible: ;</xsl:otherwise> 
</xsl:choose> 
</xsl:template> 

検索するノード全体である: "GMD:pointOfContact/GMD:CI_ResponsibleParty/GMD:INDIVIDUALNAME/GCO:の文字列"

私の出力があるべきここ は私がやったことです次の行のようなtxtファイル:

責任:Pippo;

ノードが存在し、文字列が "Pippo"の場合。

責任を負いません。

ノードが存在しない場合。

私はこの結果を得ることができない理由を教えてください。ここ

は、私が使用しているXMLの抽出された一部です:

<?xml version="1.0" encoding="UTF-8"?> 
<gmi:MI_Metadata xmlns:gmi="http://sdi.eurac.edu/metadata/iso19139-2/schema/gmi" xmlns:xsi="https://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" gco:isoType="gmd:MD_Metadata" xsi:schemaLocation="http://sdi.eurac.edu/metadata/iso19139-2/schema/gmi http://sdi.eurac.edu/metadata/iso19139-2/schema/gmi/gmi.xsd"> 
<gmd:pointOfContact> 
       <gmd:CI_ResponsibleParty> 
        <gmd:individualName> 
         <gco:CharacterString>Pippo</gco:CharacterString> 
        </gmd:individualName> 
       </gmd:CI_ResponsibleParty> 
</gmd:pointOfContact> 
</gmi:MI_Metadata> 

一定の場合には、私がこのように気にいらない見つけることができることを起こる可能性:

<gmd:pointOfContact> 
       <gmd:CI_ResponsibleParty> 
        <gmd:organisationName> 
         <gco:CharacterString>HOUSE</gco:CharacterString> 
        </gmd:organisationName> 
       </gmd:CI_ResponsibleParty> 
</gmd:pointOfContact> 
</gmi:MI_Metadata> 

とタグ「INDIVIDUALNAMEを「

+1

入力XMLのサンプルを表示するために質問を編集できますか?また、現在取得している出力も表示できますか?ありがとうございました。 –

+0

@Tim Cの提案に感謝します。私は例を追加しました。 –

答えて

0

が不足している私は

<xsl:template match="gmd:individualName"> 
    <xsl:choose> 
     <!-- check if gco:CharacterString exist --> 
     <xsl:when test="gco:CharacterString">  
       <xsl:text>Responsible: </xsl:text> 
       <xsl:apply-templates select="gco:CharacterString"/> 
       <xsl:text>;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>NO Responsible: ;</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
をしようとするだろう

または

<xsl:template match="gmd:individualName"> 
    <xsl:choose> 
     <!-- check if gco:CharacterString contains text --> 
     <xsl:when test="string-length(gco:CharacterString) &gt; 0">  
       <xsl:text>Responsible: </xsl:text> 
       <xsl:apply-templates select="gco:CharacterString"/> 
       <xsl:text>;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>NO Responsible: ;</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

@joniclevaあなたの応答に感謝しますが、残念ながら、まだ動作していません。私は責任ある名前が存在するxmlでそれをテストしました –

+0

こんにちは@ sylar_80、私はコードを更新しました。 "value-of"の代わりに "apply-templates"を使うのが望ましいです。子どもたちは、テキストのみを表示します。 しかし、あなたがそれをどのように記述しているのか、また役に立ちます、私は助けになったと思います。 – jonycleva

0

あなただけのテキストを出力している場合、あなたは本当にxsl:copyを持つ要素をコピーしようとするべきではありませんので、あなたは本当に「出力」のモードでテンプレートを必要としません。さらに、XSLTの組み込みテンプレートはすでに同じことを行うため、「ノードを抑制する」テンプレートは必要ありません。

<xsl:template match="gmd:pointOfContact/gmd:CI_ResponsibleParty"> <xsl:choose> 
<xsl:when test="gmd:individualName/gco:CharacterString"> <xsl:text>Responsible: </xsl:text> 
<xsl:value-of select="gmd:individualName/gco:CharacterString"/> 
<xsl:text>;</xsl:text> 
</xsl:when> 
<xsl:otherwise>Responsible: ;</xsl:otherwise> 
</xsl:choose> 
</xsl:template> 

は、おそらく最もエレガントなものではありませんが、それは動作するようです:

は、このXSLTを試してみてください代わりに

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" 
xmlns:gmd="http://www.isotc211.org/2005/gmd" 
xmlns:gts="http://www.isotc211.org/2005/gts" 
xmlns:gco="http://www.isotc211.org/2005/gco" 
xmlns:gml="http://www.opengis.net/gml" 
xmlns:geonet="http://www.fao.org/geonetwork"> 
<xsl:output method="text" encoding="utf-8" /> 

<xsl:strip-space elements="*" /> 

<xsl:template match="gmd:pointOfContact/gmd:CI_ResponsibleParty"> 
    <xsl:choose> 
     <xsl:when test="gmd:individualName/gco:CharacterString">  
       <xsl:text>Responsible: </xsl:text> 
       <xsl:value-of select="gmd:individualName/gco:CharacterString" /> 
       <xsl:text>;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>NO Responsible: ;</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 
+0

こんにちは、あなたの提案は、私の抽出された例と一緒に使用する場合に動作します。しかし、XML全体に適用すると、.xmlに含まれるテキスト全体が出力として出力されます。これは私が「抑制モード」とxsl:copyを使ってアプローチを使用していた理由です –

0

私は@jonyclevaの提案から始まって解決策を見つけたと思います。

他の提案はまだありません

関連する問題