2017-02-01 6 views
0

誰もxslt 1.0を使って最初の3文字から完全な名前を取得する方法を知っていますか?XSLT 1.0を使用して文字列全体を取得しますか?

<node> 
    <name>Shelly</name> 
    <name>Roger</name> 
    <name>Tommy</name> 
    <name>Ginger</name> 
</node> 

は例えば、私は、次のXMLノードをループにできるようにしたい、それが「トム」を含む文字列をループするとき(のようなものは:(// 名、「トム」)が含まれています for-each // node/name /、 'tom'を含む値を見つけ、出力(。)すると、リストからフルネーム 'Tommy'を出力する。その値。

これは可能ですか?

ありがとうございました。

答えて

1

starts-with機能を使用する必要があります。あなたが探している表現、けれども

<xsl:for-each select="node/name[starts-with(., 'Tom')]"> 

、あなたがそうのように、それをparameteriseする場合があります...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:param name="name" select="'Tom'" /> 

    <xsl:template match="/"> 
     <xsl:for-each select="node/name[starts-with(., $name)]"> 
      <p><xsl:value-of select="." /></p> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

ノートを行いますが、これは大文字と小文字が区別されます。あなたは大文字と小文字を区別しないことを望んだ場合には、もう少し作業がXSLT 1.0で必要とされて...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:variable name="l" select="'abcdefghijklmnopqrstuvwxyz'" /> 
    <xsl:variable name="u" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 

    <xsl:param name="name" select="'tom'" /> 

    <xsl:template match="/"> 
     <xsl:for-each select="node/name[starts-with(translate(., $u, $l), translate($name, $u, $l))]"> 
      <p><xsl:value-of select="." /></p> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Timさんに感謝します。私はそれを投稿した後、ほとんど私のソリューションを実現しました=) 徹底していただきありがとうございます...私はあなたのソリューションが良い。 – cerebraldecypher

0

おっと...脳のおなら...それは簡単です:

<xsl:variable name="vSuffix"> 
    <xsl:for-each select="//*[local-name()='name']"> 
     <xsl:copy-of select="substring-after(.,'tom')"/> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:value-of select="concat('tom',$vSuffix)"/> 
+1

それは簡単かもしれませんが、あなたが求めたことはしません。 - また、 'name *'の代わりに '' * * [local-name()= 'name'] 'を使うことは、意図した通りに使うのではなく、名前空間を回避しようとしていることを示していることにも注意してください。 –

0

A完全なXSLT-1.0ソリューションは、次のようになります

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="text" encoding="utf-8" omit-xml-declaration="no"/> 

    <xsl:strip-space elements="*" /> 
    <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" /> 
    <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 

    <xsl:template match="/node/name"> 
     <xsl:call-template name="NameFromFirstThreeChars"> 
     <xsl:with-param name="node" select="." /> 
     <xsl:with-param name="selText" select="'rog'" /> <!-- example for 'Roger' --> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="NameFromFirstThreeChars"> 
     <xsl:param name="node" /> 
     <xsl:param name="selText" /> 
     <xsl:variable name="upperSel" select="translate($selText,$lower,$upper)" /> 
     <xsl:if test="starts-with(translate($node,$lower,$upper), $upperSel)"> 
     <xsl:value-of select="$node" /> 
     </xsl:if> 
    </xsl:template>  

</xsl:stylesheet> 

は、このソリューションでは、大文字と小文字の変換を実行し、比較する第1 3(またはものは何でもあなたが好きな)パラメータ$selTextと文字。一致する場合は、$node変数の(text())の値を返します。

という名前のパラメータは、2つのパラメータnodeselTextに共通して適用されます。

関連する問題