שלח תשובה

זירת השאלות

502
צפיות
1
תשובות

שאלה מעניינת בxsl

,‏ 29 בנובמבר, 2005


נורא השקעתי בשאלה הזאת כי הפיתרון שלה מאוד שימושי. למי שאין כח לקרוא את כל מה שכתבתי ולהציץ בקבצים המצורפים הנה תמצית הדברים:
אני מנסה לכתוב template בxsl שיחזיר לי כתובת של ה"נוד" xml שהוא כרגע מצביע עליו. לדוגמא בxml הבא:

<MCat>
   <Lbl>אפוניים</Lbl>
   <SCat>
       <Lbl>כסאות</Lbl>
   </SCat>
   <SCat>
       <Lbl>צמיגים</Lbl>
   </SCat>
<MCat>

הכתובת של Lbl שערכו "צמיגים" הוא 1#3.כי Lbl הוא ה"נוד" הראשון בתוך SCats שהוא הנוד השלישי בתוך Mcat.

*בקבצים הכתובת קצת יותר ארוכה, זה כי הקריאה הרקורסיבית  מתבצעת פעם אחת יותר מידי (מעל האלמנט root) , זה לא מפריע אפשר לחתוך את זה אח"כ..



ועכשיו בפירוט:

יש לי עץ xml, אני עושה לו טרנספורמציה לhtml עם xsl. אני רוצה לעדכן ערכים בxml , כשהhtml הוא הממשק. בשביל זה אני צריך קישור בין אלמנט בhtml שמציג לי מידע , ל"נוד" xml שהוא מקור המידע. בשביל זה אני צריך מזהה יחודי לכל "נוד" בעץ xml שלי – כתובת!

ניסיתי לעשות את זה ע"י נתינת id לכל אלמנט html (שמכיל מידע מהxml שאני רוצה שמהשתמש יערוך) שהוא הכתובת של ה"נוד" xml. הכתובת הזאת היא הנתיב בעץ אל ה"נוד". את הנתיב הזה ניסיתי לבנות ע"י template שאני קורא לו רקורסיבית מהnode עד לשורש העץ, ובכל איטרציה הוא מוסיף לי את המיקום של ה"נוד" שהוא מצביע עליו כרגע בתוך ה"נוד" הורה שלו.   אם זה היה עובד הכל היה טוב ויפה. הבעיה היא שזה עובד חלקית מאוד.
זה הtemplate הרקורסיבי שאמור להשיג לי את הכתובת:


<xsl:call-template name="GetPath">
    <xsl:for-each select="parent::node()">
       <xsl:call-template name="GetPath">
    </xsl:for-each>
</xsl:call-template>

*לכל "נוד" יש הורה אחד אבל כך אני בוחר אותו כדי להצביע עליו כדי שהtemplate GetPath יפעל עליו.

נגיד שאני רוצה בדף שלי input של טקסט שייבנה מ"נוד" בשם Lbl :

<input type="text">
<xsl:value-of select="Lbl"/>
    <xsl:attribute name="id">
        <xsl:call-template name="GetPath">
    </xsl:attribute>
</input>

אם היינו חיים בממלכת האגדות הייתי מקבל את הכתובת של FirstName איפה שהוא לא יהיה בעץ.המשתמש היה לוחץ "שמור" , הייתי מגיע אליו בXmlDom משנה את ערכו לערך שעכשיו יש בinput ויוצא בריקודים.

אבל כמו שתוכלו לראות בקבצים המצורפים רק השלב הראשון בכתובת הוא נכון. כל שאר הכתובת 1-ים (משמע ה"נוד" הראשון בין אחיו). זה קורה לפי איך שאני מבין את זה כי הxpath שלי בוחר לtemplate רק את הnode ההורה של זה שאני מצביע עליו, ולא בוחר גם את שאר אחיו אבותיו (וכו’..) ובגלל זה אני מקבל שכתובתו היא אחד (כנראה בתוך ה-node-set שזה , גם כנראה, מה שמחזיר הxpath הזה).

ניסיתי במקום לקבל את המיקום של ה"נוד" את הערך שלו, וזה כן עובד – הוא מחזיר את הערכים של ההורה, הסב וכו’ עד ראש העץ , כמו שצריך. כלומר הוא כן רץ על ה"נודים" הנכונים, הוא פשוט בוחר רק אותם ולא את סביבתם לכן הוא חושב שמיקומם אחד.

אם עשה את זה, שיבורך, אמן,
אם מישהו רוצה לנסות לפתור את זה שיעזור לו השם
ואם מישהו יודע על xpath שיבחר לי את כל העץ רמה אחת למעלה מה"נוד" שכרגע אני מצביע עליו, אולי זה יעזור שיביא (אתה יכול גם לנסות את זה בעצמך על  הקובץ xsl המצורף)




תגיות:

1 תשובות

שלח תשובה