2017-10-25 5 views
0

以下の形式のXMLを持っています。xml内の同じ親内の重複する子の例外をスローします

サンプルXML:

{ 
    <message> 
     <parent1> 
      <child>A</child> 
      <child>B</child> 
      <child>C</child> 
     </parent1> 
     <parent2> 
      <child>A</child> 
      <child>B</child> 
      <child>B</child> 
     </parent2> 
    </message> 
} 

所望の出力:

例外:親2は重複した子が含まれています。

XMLの検証を実行するためにXSLTコードを書いてください。

を更新することは

これは私がこれまで持っているものです:

XMLの検証は、通常、[XMLスキーマ](https://en.wikipedia.org/wikiで行われ
<xsl:stylesheet version="1.0" 
       xmlns:xsl="w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" indent="no"/> 
    <xsl:template match="parent"> 
    <xsl:copy-of select="*" /> 
    <xsl:for-each select="child"> 
     <xsl:variable name="node_child" select="text()"/> 
     <xsl:variable name="numEntries" 
        select="count(../child[text()=$node_child])"/> 
     <xsl:if test="$numEntries &gt; 1"> 
     <xsl:text>Child value of </xsl:text> 
     <xsl:text> has multiple entries &#xa;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

/XML_schema)はXSLTにありません。 ''のようなものです。 XMLスキーマを書く方法。 – Dmitry

+0

何を試しましたか? XSLTでこれを行うのは簡単です(XSDの検証では少し難しいでしょう)が、助けを求める前に問題を自分で解決しようとしないと何も学ばないでしょう。 –

答えて

0
<xsl:template match="child 
        [some $s in preceding-sibling::* 
        satisfies deep-equal(., $s)]"> 
    <xsl:message terminate="yes" 
    >Dying: duplicate element <xsl:copy-of select="."/> 
</ 
+0

上記のコードをお寄せいただきありがとうございます。私はあなたの言葉を次のように続けます。上記のコードは2.0バージョンには適していますが、1.0バージョンにはいくつかのメソッドが必要です。私は以下のコードを持っていると私に示唆することは可能ですか?それは2回エラーを出力しています。 –

+0

{xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> ます。 ます。 \t \t \t \t \t \t ます。 子値に複数のエントリがある \t } –

+0

申し訳ありません。 1.0のタグに気付かなかった。あなたのテストで同じ2つの要素がある場合、あなたのコードはそれぞれのエラーメッセージを1回発行しています。あなたが兄の兄弟の間でのみ重複をチェックしているなら( '..-sibling :: child'ではなく' ../ child'を使います)、エラーは一度しか得られません。いくつかのtext()ノードのアイデンティティは、実際には非常に弱い(エラーが発生しやすい)重複テストです。あなたのデータにはうまくいくかもしれませんが、一般的には機能しません。 –

関連する問題