2011-11-10 8 views
6

は、私は、関連するICDの説明は いくつかのテキストが含まれているところDiagsをを選択しますXPathクエリを書きたい、このXML関連するリスト内の値に基づいてフィルタのXPathリスト

<DiagList> 
    <Diag id="1" icd="400"/> 
    <Diag id="2" icd="401"/> 
    <Diag id="3" icd="402"/> 
    <Diag id="4" icd="400"/> 
</DiagList> 
<ICDList> 
    <ICD id="400" description="First one"/> 
    <ICD id="401" description="Second one"/> 
    <icd id="402" description="Third one"/> 
<ICDList> 

を考えます。

たとえば、 "st"のテキストを指定した場合、Diags "1"と "4"を取得する必要があります。私が "ir"のテキストを指定する場合、私はdiags "1"、 "3"、 "4"を得なければなりません。

私は

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=/DiagList/Diag/@icd]/@description), 'st')] 

とバリエーションを試してみました。

私はそれを動作させることができませんでした。 @icdへのネスト参照が気に入らないようです。

これは可能ですか?あなたが不足している何

おかげ ベン

+0

フム。あなたが「1つ」を書いたら?次に1,2,3,4を望むでしょうか? – FailedDev

+0

優秀な質問、+1。 XPathでは、希望するノードを選択するエレガントで単一の表現を書くことができます。面白い拡張関数やXSLTのみの関数は必要ありません。 –

答えて

-1

current()の概念です。この関数は、xpath式内の現在のノードを参照する.とは異なり、xpath式全体のコンテキストノードを参照します。

ですから、使用することができます

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=current()/@icd]/@description), 'st')] 
+0

@_Mike Sokolov:これはXPathの質問ですが、あなたの答えはXSLTのみのソリューションです。 –

+0

ありがとうございます。これは私の環境では機能しませんでした(Altioフロントエンド)。私はバックエンドで何か他のものを見つけなければならないかもしれません。 –

2

使用

$pTextリテラル目的の文字列に置換されている必要があり
/*/DiagList 
     /* 
      [@icd 
      = 
      /*/ICDList/* 
       [contains(@description, $pText)] 
        /@id 
      ] 

XSLT - ベースの検証

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my "> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="pText" select="'ir'"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/DiagList 
     /* 
      [@icd 
      = 
      /*/ICDList/* 
       [contains(@description, $pText)] 
        /@id 
      ]"/> 
</xsl:template> 
</xsl:stylesheet> 

にこの変換が提供されるXML文書に適用される(整形MEDEする補正):

<t> 
    <DiagList> 
     <Diag id="1" icd="400"/> 
     <Diag id="2" icd="401"/> 
     <Diag id="3" icd="402"/> 
     <Diag id="4" icd="400"/> 
    </DiagList> 
    <ICDList> 
     <ICD id="400" description="First one"/> 
     <ICD id="401" description="Second one"/> 
     <icd id="402" description="Third one"/> 
    </ICDList> 
</t> 

希望ノードは選択され、出力にコピーされます

我々は上記の変換に設定:再度希望の結果が生成され

<xsl:param name="pText" select="'st'"/> 

<Diag id="1" icd="400" /> 
<Diag id="4" icd="400" /> 
+0

あなたはコピーなしでこれをどうしますか?テンプレートマッチ?単一のxpath式を使用して1行に同じ値を出力するにはどうすればよいですか? – FailedDev

+0

@FailedDev:あなたの質問でちょっと混乱します:1.これはXSLTの質問ではありませんが、あなたのコメントの質問はXSLTに関するものです。 2.なぜあなたは値を印刷するのですか?問題は*ノードを選択することです。 3.なぜ1行にしかないのですか? 4.結果が単一の行にあることを意味するのか、XPath式が単一の行にあるのかを意味しますか?これがXPath式を参照している場合は、読みやすくするために複数の行に記述してあります。必要に応じて1行に簡単に記述できます。 –

+0

私の質問は、別のユーティリティを使用すると、同じ結果がどうでしたか。 jqueryまたはphpを使用してxpathを使用して、結果にプリントアウトするのと同じ値を指定します。 – FailedDev

関連する問題