एकाधिक मिलान मानदंडों के आधार पर किसी अन्य XML फ़ाइल में संदर्भित XML के आधार पर मान बदलें



xslt xslt-1.0 (1)

मेरे पास एक बड़ी XML फ़ाइल है और कई मिलान मानदंडों के आधार पर किसी अन्य XML दस्तावेज़ में उन लोगों को कुछ मान बदलने की आवश्यकता है I

मेरी बड़ी एक्सएमएल फ़ाइल 'file1.xml' निम्न स्वरूप में है:

<institution>
<ukprn>1234</ukprn>
<course>
    <courseID>1</courseID>
    <courseaim>X99</courseaim>
</course>
<student>
    <birthdate>30/10/1985</birthdate>
    <instance>
        <OWNINST>1558310|1</OWNINST>
        <FC>1</FC>
        <STULOAD>100</STULOAD>
        <elq>4</elq>
        <MODE>31</MODE>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
    </instance>
</student>
<student>
    <birthdate>01/02/1999</birthdate>
    <instance>
        <OWNINST>654321|1</OWNINST>
        <FC>2</FC>
        <elq>2</elq>
        <StudentOnModule>
              <MODID>02|37522</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>02|48966</MODID>
              <MODOUT>1</MODOUT>
        </StudentOnModule>
    </instance>
    <instance>
        <OWNINST>654321|2</OWNINST>
        <FC>6</FC>
        <elq>1</elq>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
    </instance>
</student>
</institution>

मेरे पास एक दूसरी फाइल है 'file2.xml' जिसमें 'file1.xml' को अपडेट करने के लिए डेटा शामिल है I यह इस तरह संरचित है:

<studentstoamend>
<student><OWNINST>1558310|1</OWNINST><MODID>08|29400</MODID><MODOUT>6</MODOUT></student>
<student><OWNINST>1558310|1</OWNINST><MODID>08|29091</MODID><MODOUT>6</MODOUT></student>
</studentstoamend>

'File2.xml' में प्रत्येक छात्र के लिए मैं File1.xml में MODOUT को File2.xml में मान बनना चाहता हूं। उदाहरण के लिए, File1.xml में: OWNINST = 1558310 | 1, MODID = 08 | 29400 में MODOUT = 4 है, लेकिन File2.xml निर्दिष्ट करता है कि MODOUT = 6 इसलिए File1.xml को MODOUT = 6 के लिए अद्यतन किया जाना चाहिए, जो कि विशेष OWNINST / MODOUT संयोजन । आउटपुट फाइल file1.xml की एक सटीक प्रतिलिपि होना चाहिए, लेकिन File2.xml में निर्दिष्ट परिवर्तनों के साथ।

कृपया आप इसके साथ मदद कर सकते हैं क्योंकि मुझे ऐसा काम करने में सक्षम नहीं लगता।

यह कितनी दूर मुझे मिल गया है:

<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="no"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="Student/Instance[OWNINST = document('file2.xml')/studentstoamend/STUDENT/OWNINST/MODID]/MODOUT">
        <xsl:copy-of select="document('file2.xml')/studentstoamend/STUDENT[OWNINST = current()/../OWNINST]/MODID[MODID = current()/MODID]/MODOUT"/>
    </xsl:template>

</xsl:stylesheet>

तो आउटपुट फ़ाइल होना चाहिए:

<institution>
<ukprn>1234</ukprn>
<course>
    <courseID>1</courseID>
    <courseaim>X99</courseaim>
</course>
<student>
    <birthdate>30/10/1985</birthdate>
    <instance>
        <OWNINST>1558310|1</OWNINST>
        <FC>1</FC>
        <STULOAD>100</STULOAD>
        <elq>4</elq>
        <MODE>31</MODE>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
    </instance>
</student>
<student>
    <birthdate>01/02/1999</birthdate>
    <instance>
        <OWNINST>654321|1</OWNINST>
        <FC>2</FC>
        <elq>2</elq>
        <StudentOnModule>
              <MODID>02|37522</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>02|48966</MODID>
              <MODOUT>1</MODOUT>
        </StudentOnModule>
    </instance>
    <instance>
        <OWNINST>654321|2</OWNINST>
        <FC>6</FC>
        <elq>1</elq>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
    </instance>
</student>
</institution>

इस पर गौर करने के लिए धन्यवाद। मार्टिन


नोट करने के लिए मुख्य बात यह है कि XML (और XSLT) केस-संवेदी है, और ऐसा एक टेम्पलेट जिसमें पथ में Student शामिल हैं, आपके XML में एक student तत्व से मेल नहीं खा रहा है।

एक और मुद्दा यह है कि आप पथ से तत्वों को नहीं MODOUT , उदाहरण के लिए, MODOUT , MODOUT के माता-पिता हैं, उदाहरण के लिए नहीं।

इस टेम्पलेट की कोशिश करो ....

<xsl:template match="student/instance[OWNINST = document('file2.xml')/studentstoamend/student/OWNINST]/StudentOnModule/MODOUT">
    <xsl:copy-of select="document('file2.xml')/studentstoamend/student[OWNINST = current()/../../OWNINST][MODID = current()/../MODID]/MODOUT"/>
</xsl:template>

ध्यान दें, मुझे टेम्प्लेट को सरल बनाने के लिए परीक्षा हो सकती है, ताकि दूसरी बार दूसरी फ़ाइल का संदर्भ देने से बच सकें ....

<xsl:template match="MODOUT">
    <xsl:variable name="modout" select="document('file2.xml')/studentstoamend/student[OWNINST = current()/../../OWNINST][MODID = current()/../MODID]/MODOUT" />
    <xsl:choose>
        <xsl:when test="$modout">
            <xsl:copy-of select="$modout" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy-of select="." />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>




xslt-1.0