Вы используете префикс пространства имен soap12
в своих выходных данных.Вы должны объявить это в корне вашей таблицы стилей, например так:
<xsl:stylesheet ... xmlns:soap12="someuri" ...>
Также возможно, что таблица стилей на самом деле ничего не выводит, если входной корень не может быть сопоставлен с каким-либо шаблоном или выводитсяневерный XML-файл.Последнее может иметь место, если в вашем XML-файле есть элемент Payload
и Payload2
, но его корневой элемент не соответствует ни одному шаблону.
Возможно, вы захотите использовать namedшаблоны и их вызов, вместо использования apply-templates
с чем-то, что также может совпадать с контекстом.Или используйте режимы шаблонов, чтобы убедиться, что вы используете только шаблон из другого.
РЕДАКТИРОВАТЬ: взгляните на этот XML ...
<?xml version="1.0" encoding="UTF-8"?>
<test>
<Payload/>
<Payload2/>
</test>
Применение к нему таблицы стилей(с исправленным объявлением soap12
) даст следующее:
<?xml version="1.0" encoding="UTF-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<Method1>
<xdocPayload>
<Payload/>
</xdocPayload>
</Method1>
</soap12:Body>
</soap12:Envelope>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<Method2>
<xdocPayload>
<Payload2/>
</xdocPayload>
</Method2>
</soap12:Body>
</soap12:Envelope>
Это недопустимый XML, поскольку есть два корневых элемента, что недопустимо.
Вот предлагаемая доработкавашей таблицы стилей:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Envelope" priority="2">
<soap12:Envelope>
<xsl:apply-templates select="Payload"/>
</soap12:Envelope>
</xsl:template>
<xsl:template match="/Request1" priority="2">
<soap12:Envelope>
<xsl:apply-templates select="Payload"/>
</soap12:Envelope>
</xsl:template>
<xsl:template match="/Request2" priority="2">
<soap12:Envelope>
<xsl:apply-templates select="Payload2"/>
</soap12:Envelope>
</xsl:template>
<xsl:template match="/*" priority="1">
<soap12:Envelope />
</xsl:template>
<xsl:template match="Payload">
<soap12:Body>
<Method1>
<xdocPayload>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xdocPayload>
</Method1>
</soap12:Body>
</xsl:template>
<xsl:template match="Payload2">
<soap12:Body>
<Method2>
<xdocPayload>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xdocPayload>
</Method2>
</soap12:Body>
</xsl:template>
</xsl:stylesheet>
Имейте в виду, что у меня нет полной картины вашего ввода или желаемого результата, так что не просто воспринимайте вышесказанное буквально, а посмотрите, что он делает, и исправьте согласно вашимсвои собственные требования.
РЕДАКТИРОВАТЬ 2: хорошо, после того, как вы добавили образцы, становится понятнее, что вы хотите сделать.Вам нужно будет просто вызвать именованные шаблоны, как я предлагал ранее.Вот основа, с которой можно начать.Приспосабливайтесь так, как считаете нужным, проверяйте различные варианты ввода.Найдите где-нибудь программу-редактор, которая позволит вам быстро попробовать или даже отладить XSLT, это очень поможет:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Envelope" priority="2">
<soap12:Envelope>
<xsl:call-template name="Payload"/>
</soap12:Envelope>
</xsl:template>
<xsl:template match="/Request1" priority="2">
<soap12:Envelope>
<xsl:call-template name="Payload"/>
</soap12:Envelope>
</xsl:template>
<xsl:template match="/Request2" priority="2">
<soap12:Envelope>
<xsl:call-template name="Payload2"/>
</soap12:Envelope>
</xsl:template>
<xsl:template match="/*" priority="1">
<soap12:Envelope />
</xsl:template>
<xsl:template name="Payload">
<soap12:Body>
<Method1>
<xdocPayload>
<xsl:copy-of select="." />
</xdocPayload>
</Method1>
</soap12:Body>
</xsl:template>
<xsl:template name="Payload2">
<soap12:Body>
<Method2>
<xdocPayload>
<xsl:copy-of select="." />
</xdocPayload>
</Method2>
</soap12:Body>
</xsl:template>
</xsl:stylesheet>