Czy rozwiązanie zadania 2 (poprawkowego) można zaimplementować w XQuery?
Ja bym tu widział raczej XSLT, ale OK, zgadzam się na XQuery.
Ponieważ będę testował to pod Saxonem, proszę korzystać z Saxonowego sposobu deklaracji parametrów serializacji, jest to opisane tutaj. Niestety (o ile dobrze się orientuję) nie jest to określane przez standard i każda implementacja realizuje to na swój sposób.
Co oznacza automatyczne przetwarzanie
w treści zadania i priorytety dla atrybutów bądź podelementów
?
Wypisując treść przepisu należy używać zawartości elementów co, ile i jm
w takiej kolejności, w jakiej występują one w źródle. Gdy brakuje danego elementu (np. ilości)
najlepiej nie wypisywać tej własności, ale ponieważ treść zadania sugerowała użycie w takim przypadku wartości atrybutu,
przyjmę także rozwiązania wypisujące wartości atrybutów, w każdej kolejności.
Natomiast przy „grupowaniu” i sumowaniu ilości składników na początku przepisu
należy w pierwszej kolejności brać pod uwagę wartości atrybutów co, ile i jm,
a dopiero gdyby danego atrybutu nie było, brać zawartość odpowiedniego podelementu.
Można założyć, że uzyskana w ten sposób wartość jest poprawna.
Jak zaimplementować sumowanie składników? :)
Po pierwsze dla każdego przepisu należy uzyskać listę składników bez powtórzeń.
Bardzo przydatne może być grupowanie w XSLT 2.0.
W XSLT 1.0 i XQuery też da się to zrobić, np. używając osi preceding-sibling,
było to jednym z zadań na ćwiczeniach z XQuery.
Następnie dla każdego składnika trzeba przejrzeć przepis i zsumować ilości składników, oczywiście uwzględniając rózne jednostki miary. Znowu może więc przydać się grupowanie. Jeśli pojawia się składnik bez określonej ilości, trzeba dopisać do wyliczonej sumy jeszcze +.
Bardziej nie podpowiem...
Czy można nie testować rozwiązania w Saxonie, tylko założyć, że XML Spy działa tak samo?
Jeśli chodzi o XSLT – tak.
Jeśli chodzi o XQuery – w różnych implementacjach różnie zapisuje się parametry serializacji, a będę wymagał, aby wynik zawierał deklaracje HTML/XHTML, dlatego lepiej pewnie przetestować to w Saxonie.
Gdy używam <xsl:copy> do kopiowania elementów HTML,
w wyniku pojawia się np. <html:p> i przeglądarka nie chce tego zinterpretować
jako akapitu.
Bo w wyniku powinno być <p> bez prefiksu. Niestety nie umiem tego elegancko zrobić,
jedyne co przychodzi mi do głowy to <xsl:element name="local-name()"> zamiast <xsl:copy>.
Czy atrybut nazwa w komponent nie powinien być obowiązkowy? Nie bardzo wyobrażam sobie formatowanie, gdy nie będzie.
Tak, powinien być obowiązkowy i można założyć, że będzie występował. To ważne także dla kompo-ref.
Rozumiem, że jeżeli nie ma elementu <co>, to można nie wypisywać informacji o danym składniku (o jego nazwie). Ale czy jeżeli są elementy <ile> oraz <jm> (albo tylko jeden z nich), to mamy je wypisywać? Bo to może prowadzić do bezsensowych zapisów.
Czy mogę zrobić tak, że jeżeli nie ma elementu <co>, to w ogóle nie wypisuję nic o składniku?
To co jest w treści powinno być wypisane w wyniku, nawet jeśli nie ma <co>co>. Tak jak pisałem, można wtedy posłużyć się wartością atrybutu, ale można też w ogóle nie wypisywać wartości co.
Dodatkowo uogólniając troszkę poprzednie. Czy jeżeli jest element <co>, nie ma elementu <ile>, ale jest <jm>, to można <jm> nie wypisywać? Bo to też wydaje się trochę pozbawione sensu?
To może mieć sens:
Upiecz <skladnik jm="szt" co="mięso"><jm>sztukę</jm> <co>mięsa</co></skladnik>. :)
Przyjmujemy wtedy (do obliczeń) ile = 1, ale nie musimy tego wypisywać.