Проверьте разные корни в трансформации - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть следующий лист xslt, и мне интересно, можно ли проверить наличие определенного корня в файле xml? Если так, какой правильный код xslt необходим для преобразования xml в определенный шаблон? Я попытался с таблицей стилей ниже, которую я построил, но это бросило ошибку, жаловавшуюся на неверный корень. Как вы можете понять из этой таблицы стилей, если у меня есть определенный корень в 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" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/Envelope">
  <xsl:apply-templates select="Payload" />
</xsl:template>

<xsl:template match="/Request1">
    <xsl:apply-templates select="Payload"/>
</xsl:template>

<xsl:template match="/Request2">
  <xsl:apply-templates select="Payload2"/>
</xsl:template>

<xsl:template match="Payload" >
 <soap12:Envelope >
  <soap12:Body>
    <Method1>
      <xdocPayload>
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xdocPayload>
    </Method1>
    </soap12:Body>
  </soap12:Envelope>
</xsl:template>


<xsl:template match="Payload2" >
  <soap12:Envelope>
    <soap12:Body>
      <Method2>
       <xdocPayload>
         <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xdocPayload>
      </Method2>
   </soap12:Body>
 </soap12:Envelope>
</xsl:template>


</xsl:stylesheet>

c # Код, с которым я тестирую:

  XslCompiledTransform xslt = new XslCompiledTransform(true);

  xslt.Load(XmlReader.Create(new StringReader(xsltTransSheet)));

Любая помощь с благодарностью.

Спасибо, DND

2 разных XML-файла ввода:

 <Envelope>
     <order>1280</order>
 </Envelope>

или может быть

 <Request1>
    <item>7329HH</item>
 <Request1>

Требуемый вывод XML:

<soap12:Body>
            <Method1>
                <xdocPayload>
                   <Envelope>
                     <order>1280</order>
                   </Envelope>
                </xdocPayload>
             </Method1>
 </soap12:Body>

или XML Ouput окажется

  <soap12:Body>
            <Method1>
                <xdocPayload>
                   <Request1>
                      <item>7329HH</item>
                   </Request1>
                </xdocPayload>
             </Method1>
  </soap12:Body>

Я ищу тот или иной результат в зависимости от xml, поданного в xslt. Надеюсь, это объясняет это немного более тщательно.

1 Ответ

0 голосов
/ 04 ноября 2011

Вы используете префикс пространства имен 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...