Следующий вопрос нацелен на образец XML-файла, который выглядит следующим образом:
<root>
<Name>Name1</Name>
<Description>Description1</Description>
<Application>
<ApplicationItem>1</ApplicationItem>
<ApplicationItem>2</ApplicationItem>
<ApplicationItem>3</ApplicationItem>
</Application>
<Location>
<LocationItem>1</LocationItem>
<LocationItem>2</LocationItem>
</Location>
</root>
Моя цель состоит в том, чтобы иметь любой некорневой элемент с дочерними элементами (известно, что его родительские имена называются идентично с суффиксом«Элемент» и преобразование его так, чтобы дочерние элементы были удалены и заменены строкой с разделителями для родительского значения. Я смог сделать это, нацелив родительский и дочерний элементы, в частности, следующим образом.
<!-- Copy over entire XML document -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Find Application and apply ApplicationItem template to it-->
<xsl:template match="Application">
<Application>
<xsl:apply-templates select="ApplicationItem" />
</Application>
</xsl:template>
<!-- Transform and remove ApplicationItem -->
<xsl:template match="ApplicationItem">
<xsl:value-of select=
"concat(., substring('|', 1 div not(position()=last())))"/>
</xsl:template>
<!-- Find Location and apply LocationItem template to it-->
<xsl:template match="Location">
<Location>
<xsl:apply-templates select="LocationItem" />
</Location>
</xsl:template>
<!-- Transform and remove LocationItem -->
<xsl:template match="LocationItem">
<xsl:value-of select=
"concat(., substring('|', 1 div not(position()=last())))"/>
</xsl:template>
Однако я хотел бы иметь возможность создать общий xslt без необходимости конкретно указывать какой-либо из элементов, но применить вышеупомянутое преобразование к любому некорневому элементу с дочерними элементами. Пример псевдокода ниже
<!-- Copy over entire XML document -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Find non-root parent and apply child template to it-->
<xsl:template match="*parent with children*">
<*ParentElementName*>
<xsl:apply-templates select="*ChildElementName OR ParentElementName+Item*" />
</*ParentElementName*>
</xsl:template>
<!-- Transform and remove *ChildElementName* -->
<xsl:template match="*ChildElementName*">
<xsl:value-of select=
"concat(., substring('|', 1 div not(position()=last())))"/>
</xsl:template>
Могу ли я применить универсальный шаблон, который будет применяться к любому элементу, который соответствует вышеуказанным критериям? В моем реальном XML-файле есть десятки приведенных выше примеров XML, и этот канал может получить дополнительные экземпляры в будущем,Я хотел бы, чтобы xslt преобразовал их всех.
возможно?