Вместо этого вы можете использовать Collectors.toMap
в качестве downstream
:
Map<Resource, Map<String, Object>> result = pResolved
.stream()
.collect(groupingBy(Function.identity(),
flatMapping(resource -> resource.getCapabilities().stream(),
flatMapping(cap -> cap.getAttributes().entrySet().stream(),
toMap(Map.Entry::getKey, Map.Entry::getValue)))));
XSLT перестанет работать из-за очевидных вещей как опечатки. Однако наиболее вероятная ситуация касается использования пространства имен. Если Вы объявили пространство имен по умолчанию для своего XML, но не включайте это в свой XSLT, XSLT не будет соответствовать шаблонам, как Вы могли бы ожидать.
Следующий пример добавляет xmlns:business
атрибут, который объявляет что объекты, квалифицированные business
префикс принадлежит пространству имен mynamespace.uri
. Я затем использовал этот префикс для квалификации соответствий шаблона Address и Addresses. Конечно, необходимо будет изменить пространство имен URI на любые соответствия пространство имен по умолчанию XML-файла.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:business="mynamespace.uri"
exclude-result-prefixes="msxsl">
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="business:Addresses">
<xsl:element name="BusinessAddresses">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="business:Address">
<xsl:element name="BusinessAddress">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Существует несколько способов достигнуть этой последней части к Вашей проблеме, BusinessAddress или ContactAddress, но самое легкое должно изменить шаблон match
атрибуты для рассмотрения родительских узлов. Если Вы думаете match
припишите как путь к XML для узла, эта опция становится более ясной (содержание шаблонов, не учтенных для краткости):
<xsl:template match="business:Business/business:Addresses>
</xsl:template>
<xsl:template match="business:Business/business:Addresses/business:Address">
</xsl:template>
<xsl:template match="business:Contact/business:Addresses">
</xsl:template>
<xsl:template match="business:Contact/business:Addresses/business:Address">
</xsl:template>
Другие методы существуют для достижения этого если match
остается на основе просто имени элемента, но их более трудно реализовать, следовать, и поддержать, поскольку они включают использование условного выражения, проверяет родительскую иерархию узла элемента, являющегося обрабатывающим, все в шаблоне.
Возможно, это, если данные Вы показываете, действительно похоже на то, с чем Вы взялись за работу
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Businesses">
<Businesses>
<xsl:apply-templates/>
</Businesses>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="Addresses">
<BusinessAddresses>
<xsl:apply-templates/>
</BusinessAddresses>
</xsl:template>
<xsl:template match="Addresses/Address">
<BusinessAddress>
<xsl:value-of select="."/>
</BusinessAddress>
</xsl:template>
</xsl:stylesheet>