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ć.