2017-02-28 1 views
0

メールが "test.com"で終わるすべてのセットをコピーする必要があります。カウントが5より大きい場合は、いくつか試しましたが、何もしませんでした動作するようです。XSLT 1.0をカウントし、子が終了する構造体をコピーする

どうすればxslt 1.0でこれを行うことができますか?例えば

<root> 
    <sets> 
     <set> 
      <mail>[email protected]</mail> 
      <foo/> 
     </set> 
     <set> 
      <mail>[email protected]</mail> 
      <foo/> 
     </set> 
     <set> 
      <mail>[email protected]</mail> 
      <foo/> 
     </set> 
    </sets> 
</root> 

私はこの試みた:私はメールは "test.com" で終わるすべてのセットをコピーする必要が

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:if test="count(/root/sets/set[mail = '*test.com'])"> 
     <root> 
      <sets> 
       <xsl:for-each select="/root/sets/set"> 
        <xsl:if test="contains(./mail, 'test.com')"> 
         <xsl:copy-of select="./*"/> 
        </xsl:if> 
       </xsl:for-each> 
      </sets> 
     </root> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 
+1

は、あなたはゼロから1を書くよりも、既存のXSLTを修正することが容易であるとして、あなたは現在、試してみましたXSLTを表示することができますか?また、現在のXMLに必要な正確な出力を表示することもできます。ありがとうございました! –

答えて

1

を。

方法について:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="sets"> 
    <xsl:copy> 
     <xsl:apply-templates select="set[substring-after(mail, '@')='test.com']"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

こんにちはmichael、申し訳ありませんが、最初に要素を数えるという要件を忘れてしまいました。 – Wookiee

+0

私のテストをあなたの選択した 'count(// set [substring-after(mail、 '@')= 'test.com'])> 5'に置き換えることによって、それを稼働させました。たぶん私はあなたのソリューションでこれを行うことができますか? – Wookiee

+0

あなたの質問を編集して、それぞれの場合に得られると思われる正確な結果を示す例を投稿することができます(つまり、数が5を超え、それが0以外の場合)。 –

関連する問題