/ / Varying xpath-default-namespace w plikach źródłowych XML - xslt, xpath, namespaces, default, transform

Różne xpath-default-namespace w plikach źródłowych XML - xslt, xpath, namespace, default, transform

Mam zestaw plików XML, które przetwarzam za pomocą transformacji XSL. Mają domyślną przestrzeń nazw, więc moja transformacja XSL musi zawierać deklarację:

xpath-default-namespace = "urn: CZ-RVV-IS-VaV-XML-NS: data-1.2.2"

Problem polega na tym, że ta wartość zmienia się z czasemdo czasu, a moja transformacja nagle przestaje działać, dopóki nie spojrzę na przykład z nowego pliku, wyodrębnij ten identyfikator przestrzeni nazw i umieść go w transformacji, dzięki czemu transformacja przestaje działać dla starych plików. Czy istnieje sposób na przekazanie tego jako parametru lub ustawienie go w jakiś sposób w czasie wykonywania? Próbowałem składni parametrów, które sprawdziłem w różnych tutorialach, ale żadna nie działała dla tego konkretnego zastosowania.

Przeszukałem wszystkie fora i znalazłemodniesienia do kodu XSL niezależnego od przestrzeni nazw, ale nie wymyślono, jak to zrobić. Ian Williams, „książka” XSLT i Xpath, stwierdza, że ​​domyślna przestrzeń nazw musi zostać zadeklarowana, w przeciwnym razie nic nie znajdzie się w strumieniu wyjściowym, tak jak dla mnie zadziałało. Ale tak naprawdę nie chcę tego zmieniać ręcznie regularnie chcę dać użytkownikowi coś, co będzie działać, bez potrzeby ciągłej uwagi ode mnie.

Jedyny w 100% niezawodny sposób, który do tej pory wymyśliłemjest użycie standardowego języka programowania do otwierania zarówno źródła XML, jak i transformacji XSL jako plików tekstowych, wyodrębnienia URI ze źródła XML, wklejenia go do transformacji XSL, zamknięcia obu plików, a następnie, w końcu, uruchomienia rzeczywistej transformacji. To działa, ale jest niesamowicie nieprzyzwoite, przynajmniej według mojego gustu. Jak lepiej poradzić sobie ze zmianą domyślnych przestrzeni nazw?

Pete

Odpowiedzi:

5 dla odpowiedzi № 1

Wartość przestrzeni nazw xpath-default-name musi wynosić astatyczny identyfikator URI, więc będziesz musiał wstępnie przetworzyć arkusz stylów, jeśli chcesz go zmieniać. Jednym ze sposobów na to byłoby użycie XSLT. Zastosuj następujący meta-styl arkusza do swojego głównego arkusza stylów za każdym razem, a następnie wywołaj -przetworzony wynik zamiast tego.

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- Pass in the new namespace URI as a stylesheet parameter -->
<xsl:param name="new-uri" required="yes"/>

<!-- By default, copy everything as is -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<!-- But update the value of @xpath-default-namespace -->
<xsl:template match="@xpath-default-namespace">
<xsl:attribute name="{name()}" namespace="{namespace-uri()}">
<xsl:value-of select="$new-uri"/>
</xsl:attribute>
</xsl:template>

</xsl:stylesheet>

Jest to trochę dziwny przypadek użycia,ponieważ przestrzenie nazw nie zostały zaprojektowane tak, aby były tak dynamiczne. Zostały zaprojektowane tak, aby kwalifikować nazwy, tj. tworzą część nazwy. Patrząc na to w ten sposób, dynamiczne przestrzenie nazw nie mają większego sensu. Wyobraź sobie bazę danych, której nazwy tabel i pól zmieniały się co jakiś czas, zmuszając Cię do przepisania wszystkich skryptów SQL, aby nadążyć za zmianami. Z tym to jest podobne.


0 dla odpowiedzi nr 2

Czy próbowałeś zdefiniować parametr arkusza stylów? <xsl:param name="xpdn"/> i użycie go w deklaracji arkusza stylów lub deklaracji szablonu najwyższego poziomu jak w

<xsl:template match="...." xpath-default-namespace="$xpdn">

Nie mogę znaleźć w specyfikacji niczego, co mówi, że to nie zadziała (ale nie jestem w stanie tego teraz spróbować).