Zastosowanie (zakładając dostarczony fragment XML elementy, które są elementami podrzędnymi bieżącego węzła i jest tylko jeden element o pożądanej właściwości):
substring-before(*[not(starts-with(., 'info:eu-repo'))], '-')
XSLT - na podstawie weryfikacji:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select=
"substring-before(*[not(starts-with(., 'info:eu-repo'))], '-') "/>
</xsl:template>
</xsl:stylesheet>
Kiedy transformacja ta jest stosowana do poniższego dokumentu XML (dostarczonego fragmentu zawinięte w jednym górnego elementu i nazw zadeklarowanej):
<t xmlns:dc="some:dc">
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2012-07-04</dc:date>
</t>
Wyrażenie XPath jest oceniane od górnego elementu i od końca DOPROWADZIĆ tej oceny jest kopiowany do wyjścia:
2012
II. Więcej niż jeden element o pożądanej właściwości:
W tym przypadku nie można utworzyć żądanych danych za pomocą jednego wyrażenia XPath 1.0.
Ta transformacja XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[not(starts-with(., 'info:eu-repo'))]/text()">
<xsl:copy-of select="substring-before(., '-') "/>
==============
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
po nałożeniu na tego dokumentu XML:
<t xmlns:dc="some:dc">
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2012-07-04</dc:date>
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2011-07-05</dc:date>
</t>
produkuje Wanted, poprawny wynik:
2012
==============
2011
==============
III. XPath 2.0 jedno-liner
*[not(starts-with(., 'info:eu-repo'))]/substring-before(., '-')
Gdy XPath wyrażenie 2,0 ocenia się górny element dokumentu ostatni XML (najbliższy powyżej), The Wanted lat produkowane są:
2012 2011
XSLT 2.0 - na podstawie weryfikacji:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:sequence select=
"*[not(starts-with(., 'info:eu-repo'))]/substring-before(., '-')"/>
</xsl:template>
</xsl:stylesheet>
Gdy ta transformacja jest stosowany w ostatnim dokumencie XML, wyrażenie XPath jest oceniane, a wynik tej oceny jest kopiowany do wyjścia:
2012 2011
IV. Sprawa najogólniejszym i trudne:
Teraz, zjedzmy tego dokumentu XML:
<t xmlns:dc="some:dc">
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2012-07-04</dc:date>
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2011-07-05</dc:date>
<dc:date>*/date/embargoEnd/2014-06-12</dc:date>
</t>
Nadal chcesz uzyskać letnią część wszystkich dc:date
elementów, których wartość ciągu nie uruchamia się z „informacją: eu-repo ". Jednak żadne z poprzednich rozwiązań nie działa poprawnie z ostatnim elementem dc:date
powyżej.
Co ciekawe, dane poszukiwanych wciąż mogą być produkowane przez jednego XPath 2.0 ekspresji:
for $s in
*[not(starts-with(., 'info:eu-repo'))]/tokenize(.,'/')[last()]
return
substring-before($s, '-')
Gdy ta ekspresja jest oceniany poza górny element powyższego dokumentu XML The Wanted, poprawny wynik jest produkowany:
2012 2011 2014
I to jest XSLT 2.0 - na podstawie weryfikacji:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:sequence select=
"for $s in
*[not(starts-with(., 'info:eu-repo'))]/tokenize(.,'/')[last()]
return
substring-before($s, '-')
"/>
</xsl:template>
</xsl:stylesheet>
Próbowałem bez "ale nie działa. wynik otrzymałem 2012 publicationYear> / publicationYear> –
Edytowałem swoją odpowiedź. Wygląda na to, że masz również problem z iteracją. – DRCB
dziękuję, wstydź mi, wystawiam test poza iterację –