Результат функции XSLT Document() содержит нежелательный xmlns=

гуру XSLT,

У меня есть XSLT, который включает в вывод нежелательный xmlns="". Я видел эту проблему/вопрос, который задавали и отвечали на этом сайте много раз, но, похоже, я не могу получить ни одного ответа для работы над тем, что я делаю. И я должен предупредить вас, что я новичок в XSLT и не очень хорошо в нем разбираюсь.

Мой XSLT собирает набор данных из вызывающего его приложения, а затем также использует document() для сбора дополнительных данных. Все это прекрасно работает, мне просто нужно избавиться от xmlns=""

XML, вызываемый document(),

<?xml version="1.0" encoding="UTF-8"?><BiExport xmlns="">
<ExportData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Phone>8885551212</Phone>
<ClientRefCmtSuffix/>
<UDFData>
<DictionaryEntry>
<Key xsi:type="xsd:string">MyCompany Completed Date</Key>
<Value xsi:type="xsd:string">06/24/2013</Value>
</DictionaryEntry>
<DictionaryEntry>
<Key xsi:type="xsd:string">Rush</Key>
<Value xsi:type="xsd:string">0</Value>
</DictionaryEntry>
<DictionaryEntry>
<Key xsi:type="xsd:string">Suffix</Key>
<Value xsi:type="xsd:string">0000000000</Value>
</DictionaryEntry>
</UDFData>
<ReportCreateDate>2014-09-26T15:45:48.83952-07:00</ReportCreateDate>
</ExportData>
</BiExport>

И да, я знаю, что у него есть <BiExport xmlns="">, нет, я не могу это изменить, и даже когда я удалил его перед применением XSLT, это не имело никакого значения.

Мой XSLT

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bean="http://www.MyCompany.com/eventgenerator/beans">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />

  <xsl:variable name="ReportCreateDate" select="bean:FileEvent/bean:Context[@Id='XPathStep']/bean:Item[@Name='ReportCreateDate']/@Value"/>
  <xsl:variable name="PDFFile" select="concat($PDFFilename, '.', $PDFFileExt)"/>
  <xsl:variable name="InputFile" select="bean:FileEvent/bean:Context[@Id='XPathStep']/bean:Item[@Name='InputFile']/@Value"/>
  <xsl:variable name="PDFFilename" select="bean:FileEvent/bean:Context[@Id='XSLTStep']/bean:Item[@Name='PDFFilename']/@Value"/>
  <xsl:variable name="InputFilePath" select="bean:FileEvent/bean:Context[@Id='ArchiveMessageStep']/bean:Item[@Name='ArchiveDirectory']/@Value"/>
  <xsl:variable name="InputFileString" select="concat($InputFilePath, '\', $PDFFilename, '.xml')"/>

  <xsl:template name="UDFs" match="document($InputFileString)/BiExport/ExportData/UDFData/DictionaryEntry">
    <xsl:param name="pKey" select="." />
    <Item name="{$pKey}">
      <xsl:value-of select="../Value"/>
    </Item>
  </xsl:template>

  <xsl:template match="/">
    <MDXPackage version="1.0" xmlns="http://www.MyCompany.com/schemas">
      <Payload>
        <PayloadContext>

          <xsl:apply-templates select="document($InputFileString)/BiExport/ExportData/UDFData/DictionaryEntry/Key" />

          <xsl:choose>
            <xsl:when test="string($ReportCreateDate)">
              <Item name="ReportCreateDate">
                <xsl:value-of select="$ReportCreateDate"/>
              </Item>
            </xsl:when>
            <xsl:otherwise></xsl:otherwise>
          </xsl:choose>

          <xsl:choose>
            <xsl:when test="string($PDFFile)">
              <Item name="PDFFile">
                <xsl:value-of select="$PDFFile"/>
              </Item>
            </xsl:when>
            <xsl:otherwise></xsl:otherwise>
          </xsl:choose>
          <!-- more of the same follows-->

        </PayloadContext>
      </Payload>
    </MDXPackage>
  </xsl:template>
</xsl:stylesheet>

И выход

<MDXPackage xmlns="http://www.mitchell.com/schemas" version="1.0">
<Payload>
<PayloadContext>
<Item xmlns="" name="MyCompany Completed Date">06/24/2013</Item>
<Item xmlns="" name="Rush">0</Item>
<Item xmlns="" name="Suffix">0000000000</Item>
<Item name="ReportCreateDate">2014-09-26T13:53:28.3831684-07:00</Item>
<Item name="ClaimantPhone">8885551212</Item>
</PayloadContext>
</Payload>
</MDXPackage>

Заранее спасибо за любую помощь в понимании того, почему я получаю объявление пустого пространства имен и как от него избавиться.

DL


person DLoysen    schedule 26.09.2014    source источник
comment
Что находится в вашем входном документе (документе XML, к которому вы применяете преобразование)?   -  person michael.hor257k    schedule 27.09.2014


Ответы (1)


Все это прекрасно работает, мне просто нужно избавиться от xmlns=""

Это не вопрос избавления от xmlns="". Они здесь по уважительной причине. Причина в том, что все родительские элементы MDXPackage, Payload и PayloadContext находятся в пространстве имен ("http://www.mitchell.com/schemas"), а Item — нет.

Если вы хотите удалить привязки без пространства имен, вы должны поместить элементы в то же пространство имен, что и их предки. Это вероятно означает изменение этого:

  <Item name="{$pKey}">
    <xsl:value-of select="../Value"/>
   </Item> 

to:

<Item xmlns="http://www.MyCompany.com/schemas" name="{$pKey}">
    <xsl:value-of select="../Value"/>
</Item> 

Обратите внимание, что это не косметическое изменение; это фактически меняет имя элемента.

person michael.hor257k    schedule 26.09.2014
comment
Альтернативный способ добиться того же — переместить xmlns="http://www.MyCompany.com/schemas" из MDXPackage внутри шаблона на верхний уровень xsl:stylesheet. Это приведет к тому, что все литеральные элементы без префикса в таблице стилей будут помещены в это пространство имен. - person Ian Roberts; 27.09.2014
comment
+1 Я попробовал это, и это тоже сработало. Спасибо и Яну, и @michael. - person DLoysen; 01.10.2014