2017-10-24 10 views
0

xml属性とテキストノードをすべて調べて、リストから文字の存在を識別し、一致しなかった文字値を出力する必要があります。すべてのノードと属性で一致しない値を特定する:XSLT2.0

text()ノードを確認できますが、属性のチェックを実行できません。

<xsl:template match="@*|node()"> 
<xsl:variable name="getDelimitersToUseNodes" select="('$' ,'#' ,'*' ,'~')[not(contains(current(),.))]"/> 
    <xsl:variable name="getDelimitersToUseAttr" select="string-join(('$','#','*','~')[not(contains(@*/,.))],',')"/> 
    <xsl:variable name="getDelimitersToUse" select="concat(string-join($getDelimitersToUseNodes,','),',',string-join($getDelimitersToUseAttr,','))"/> 
    <!--xsl:variable name="delim" select="distinct-values($getDelimitersToUse,',')"/--> 
    <xsl:value-of select="$getDelimitersToUse"/> 
    </xsl:template> 

マイアップ嘲笑サンプルファイルには、あなたはすべてのそれらのテキストおよび属性ノードを処理し、以前のように、同じチェックを作ることができ

<?xml version="1.0"?> 
<sample> 
<test1 name="#theGoofy">My$#test</test1> 
<test2 value="$#@">description test2*</test2> 
</sample> 

答えて

0

を下回っています。あなたは本当にテキストあなたは単純にすべてのテキストノードに含まれていないすべての文字を確認したい場合は

Text #theGoofy does not contain $ * ~ 
Text My$#test does not contain * ~ 
Text $#@ does not contain * ~ 
Text description test2* does not contain $ # ~ 

のような結果を得るために

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:param name="characters" as="xs:string*" select="'$' ,'#' ,'*' ,'~'"/> 

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

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

<xsl:template match="text() | @*"> 
    <xsl:value-of select="'Text', ., 'does not contain', $characters[not(contains(current(), .))], '&#10;'"/> 
</xsl:template> 

</xsl:stylesheet> 

を使用したと仮定すると、あなたが望むどの出力形式言っていませんアトリビュートノードは、

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:param name="characters" as="xs:string*" select="'$' ,'#' ,'*' ,'~'"/> 

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

<xsl:variable name="nodes-to-inspect" as="node()*" select="//text() | //@*"/> 

<xsl:template match="/"> 
    <xsl:value-of select="for $c in $characters return $c[not($nodes-to-inspect[contains(., $c)])]"/> 
</xsl:template> 

</xsl:stylesheet> 

のようにする必要があります。

+0

ありがとうございます。私の出力は、ファイルにないカンマで区切られた別個の値を含む変数になります。上記の場合、 '〜'が出力され、XSLTの出力として渡されます。 – ChipsnCoke

+0

@ChipsnCoke、テキストまたは属性ノードに含まれていないすべての文字を一度に出力しようとする2番目のサンプルを追加しました。 –

+0

これは美しく動作します。ありがとうございました!!。 $ cの仕組みを教えてください。私はこのように定義して使用したことはありません。 – ChipsnCoke

関連する問題