2013-08-11 2 views
2

Я пытаюсь создать несколько xml-файлов с помощью xslt. мой * input.xm * л файлсоздание нескольких xml-файлов с помощью xslt

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
<soapenv:Body> 
<ns1:getDocumentByKeyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
<Document xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
<Attributes> 
<Attribute name="duration">0:00:00.084</Attribute> 
<Attribute name="count">7</Attribute> 
<Attribute name="entity">Requisition</Attribute> 
<Attribute name="mode">XML</Attribute> 
<Attribute name="version">http://www.taleo.com/ws/tee800/2009/01</Attribute> 
</Attributes> 
<Content> 
<ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
<record> 
<field name="ContestNumber">1300000F</field> 
    <field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">1300000H</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">1300000T</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">13000018</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">000123</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">1300000R</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">13000016</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
</ExportXML> 
</Content> 
</Document> 
</ns1:getDocumentByKeyResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

мой XSLT является sample.xslt

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:param name="pDest" select="'file:///c:/temp/'"/> 
<xsl:template match="*[starts-with(name(),'ExportXML')]"> 
<xsl:for-each select="record"> 
<xsl:result-document href="{$pDest}section{position()}.xml"> 
<JobPositionPostings> 
<JobPositionPosting> 
<xsl:apply-templates select="*:field[starts-with(@name,'ContestNumber')]"/> 
<JobDisplayOptions> 
<xsl:apply-templates select="*:field[starts-with(@name,'ManagerRequisitionTitle')]"/> 
</JobDisplayOptions> 
</JobPositionPosting> 
</JobPositionPostings> 
</xsl:result-document> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

я не получаю должного вывода. я хочу, чтобы все данные входных тегов поступали в отдельный файл, такой как

<?xml version="1.0" encoding="UTF-8"?> 
    </JobPositionPostings> 
    <JobPositionPostings> 
    <JobPositionPosting> 
<contestnumber>13000016</contestnumber> 
<JobDisplayOptions> 
<managerrequisitiontitle>Project Manager</managerrequisitiontitle> 
</JobDisplayOptions> 
</JobPositionPosting> 
</JobPositionPostings> 

, пожалуйста, предложите мне любое решение. Спасибо заранее.

+0

Я думаю, что это трудно, если не невозможно достичь с помощью синтаксического анализа xslt в одиночку .... – rene

ответ

0

У вас есть пара проблем с вашим XSLT, главным образом вокруг пространств имен. Вы начинаете со следующим матчем шаблона

<xsl:template match="*[starts-with(name(),'ExportXML')]"> 

Это прекрасно, но вы только действительно нужно это сделать, если вы знаете, что ExportXML элемент принадлежит пространству имен (в вашем случае это делает), но делать а не пространство имен. В идеале, однако, вы должны использовать здесь «local-name()», но не «name()», потому что name() будет включать в себя любой префикс пространства имен и поэтому не будет работать в следующем случае.

<x:ExportXML xmlns:x="http://www.taleo.com/ws/integration/toolkit/2005/07"> 

Во всяком случае, проблема возникает с вашей следующей строкой XSLT

<xsl:for-each select="record"> 

Это ищет рекорда элемента не часть любого пространства имен, когда записи элемента в вашем XML является часть того же пространства имен, что и ExportXML (как и все его потомки). Вы должны использовать подобный синтаксис здесь (предполагается, что вы действительно не знаете имен заранее)

<xsl:for-each select="*[starts-with(local-name(),'record')]"> 

Следующая проблема с кодом используется для получения значения «ContestNumber» (и «ManagerRequisitionTitle»):

<xsl:apply-templates select="*:field[starts-with(@name,'ContestNumber')]"/> 

Помимо того, что синтаксически неверно, у вас есть один и тот же вопрос с элементом поле быть в пространстве имен, так что вы должны сделать это

<xsl:apply-templates select="*[starts-with(local-name(), 'field')][@name='ContestNumber']"/> 

Хотя использование xsl: apply-templates, вероятно, здесь не требуется, поэтому xsl: значение должно делать.

Попробуйте XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="pDest" select="'file:///c:/temp/'"/> 
    <xsl:template match="*[starts-with(local-name(),'ExportXML')]"> 
     <xsl:for-each select="*[starts-with(local-name(),'record')]"> 
     <xsl:result-document href="{$pDest}section{position()}.xml"> 
      <JobPositionPostings> 
       <JobPositionPosting> 
        <xsl:value-of select="*[starts-with(local-name(), 'field')][@name='ContestNumber']"/> 
        <JobDisplayOptions> 
        <xsl:value-of select="*[starts-with(local-name(), 'field')][@name='ManagerRequisitionTitle']"/> 
        </JobDisplayOptions> 
       </JobPositionPosting> 
      </JobPositionPostings> 
     </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="*[starts-with(local-name(), 'Attributes')]"/> 
</xsl:stylesheet> 

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

Конечно, если бы вы сделали то, что пространство имен всегда будет одинаковым, вы можете упростить XSLT, объявив пространство имен. Этот XSLT должен также работать:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="pDest" select="'file:///c:/temp/'"/> 
    <xsl:template match="ExportXML"> 
     <xsl:for-each select="record"> 
     <xsl:result-document href="{$pDest}section{position()}.xml"> 
      <JobPositionPostings> 
       <JobPositionPosting> 
        <xsl:value-of select="field[@name='ContestNumber']"/> 
        <JobDisplayOptions> 
        <xsl:value-of select="field[@name='ManagerRequisitionTitle']"/> 
        </JobDisplayOptions> 
       </JobPositionPosting> 
      </JobPositionPostings> 
     </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="Attributes"/> 
</xsl:stylesheet> 

EDIT: Один из способов проверить шаблон соответствия является временно изменить XSLT не использовать XSL: результат-документ. Вместо этого, изменить его на выход нормального элемент в этой точке

<!-- <xsl:result-document href="{$pDest}section{position()}.xml"> --> 
<file href="{$pDest}section{position()}.xml"> 
    <JobPositionPostings>...</JobPositionPostings> 
</file> 

Затем используйте инструмент тестирования XSLT (например, http://xslttest.appspot.com/) и тестировать XML и исправленный XSLT, чтобы увидеть, если создаются множественные файл элементов , Если это так, вы должны иметь возможность вернуться к использованию xsl: result-document.

+0

спасибо за ur reply.but моя проблема все еще не решена. Я использовал первый xslt, предложенный вами, но я не получаю никакого вывода. Я думаю, что это утверждение ничего не возвращает. из-за того, что в нем содержится пространство имен. Есть ли какое-либо решение для тега Containing пространства имен как корневой тег. – user1906222

+0

Шаблон должен соответствовать элементу, независимо от пространства имен, как объяснено в ответе. У вашего XSLT есть другие шаблоны, отличные от тех, которые указаны в вашем вопросе? Обратите внимание, что я внесла поправки в свой ответ, чтобы показать, как вы могли бы протестировать шаблон, фактически сопоставляя что-либо. –

+0

Привет, Тим, еще раз спасибо.Именно мне очень помогли. теперь я получаю правильный вывод. То же самое, когда я делаю свой инструмент для подключения к талео, чтобы преобразовать его, не генерируя никакого вывода. Я думаю, ошибка с инструментом преобразования taleo only.i получил семь выходных файлов, используя этот файл href.thanku снова – user1906222

1

Ниже приведены два решения, хотя мне пришлось сделать некоторые предположения, потому что вы не совсем поняли свои требования. В первом решении soap.xsl используется стиль pull, в котором элементы отображаются в вашей таблице стилей. Второе решение soap2.xsl использует стиль push, в котором элементы синтезируются из имен атрибутов. Я не знал, что еще вы хотели сделать со своей таблицей стилей после того, как эти основы были покрыты.

t:\ftemp>type soap.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  
<soapenv:Body> 
<ns1:getDocumentByKeyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
<Document xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
<Attributes> 
<Attribute name="duration">0:00:00.084</Attribute> 
<Attribute name="count">7</Attribute> 
<Attribute name="entity">Requisition</Attribute> 
<Attribute name="mode">XML</Attribute> 
<Attribute name="version">http://www.taleo.com/ws/tee800/2009/01</Attribute> 
</Attributes> 
<Content> 
<ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
<record> 
<field name="ContestNumber">1300000F</field> 
    <field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">1300000H</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">1300000T</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">13000018</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">000123</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">1300000R</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
<record> 
<field name="ContestNumber">13000016</field> 
<field name="ManagerRequisitionTitle">Project Manager</field> 
</record> 
</ExportXML> 
</Content> 
</Document> 
</ns1:getDocumentByKeyResponse> 
</soapenv:Body> 
</soapenv:Envelope> 
t:\ftemp>rmdir /s /q temp 

t:\ftemp>call xslt2 soap.xml soap.xsl 

t:\ftemp>type temp\section1.xml 
<JobPositionPostings> 
    <JobPositionPosting> 
     <contestnumber>1300000F</contestnumber> 
     <JobDisplayOptions> 
     <managerrequisitiontitle>Project Manager</managerrequisitiontitle> 
     </JobDisplayOptions> 
    </JobPositionPosting> 
</JobPositionPostings> 

t:\ftemp>dir temp 
Volume in drive T is VBOX_t 
Volume Serial Number is 0E00-0001 

Directory of t:\ftemp\temp 

2013-08-11 17:00    269 section1.xml 
2013-08-11 17:00    269 section2.xml 
2013-08-11 17:00    269 section3.xml 
2013-08-11 17:00    269 section4.xml 
2013-08-11 17:00    267 section5.xml 
2013-08-11 17:00    269 section6.xml 
2013-08-11 17:00    269 section7.xml 
       7 File(s)   1,881 bytes 
       0 Dir(s) 8,351,150,080 bytes free 

t:\ftemp>type soap.xsl 
<xsl:stylesheet version="2.0" 
    xpath-default-namespace="http://www.taleo.com/ws/integration/toolkit/2005/07" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pDest" select="'temp/'"/> 

<xsl:template match="/"> 
    <xsl:for-each select="//record"> 
    <xsl:result-document href="{$pDest}section{position()}.xml"> 
     <JobPositionPostings> 
     <JobPositionPosting> 
      <contestnumber> 
      <xsl:value-of select="field[@name='ContestNumber']"/> 
      </contestnumber> 
      <JobDisplayOptions> 
      <managerrequisitiontitle> 
       <xsl:value-of select="field[@name='ManagerRequisitionTitle']"/> 
      </managerrequisitiontitle> 
      </JobDisplayOptions> 
     </JobPositionPosting> 
     </JobPositionPostings> 
    </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
t:\ftemp>rmdir /s /q temp 

t:\ftemp>call xslt2 soap.xml soap2.xsl 

t:\ftemp>type temp\section2.xml 
<JobPositionPostings> 
    <JobPositionPosting> 
     <contestnumber>1300000H</contestnumber> 
     <JobDisplayOptions> 
     <managerrequisitiontitle>Project Manager</managerrequisitiontitle> 
     </JobDisplayOptions> 
    </JobPositionPosting> 
</JobPositionPostings> 

t:\ftemp>dir temp 
Volume in drive T is VBOX_t 
Volume Serial Number is 0E00-0001 

Directory of t:\ftemp\temp 

2013-08-11 17:00    269 section1.xml 
2013-08-11 17:00    269 section2.xml 
2013-08-11 17:00    269 section3.xml 
2013-08-11 17:00    269 section4.xml 
2013-08-11 17:00    267 section5.xml 
2013-08-11 17:00    269 section6.xml 
2013-08-11 17:00    269 section7.xml 
       7 File(s)   1,881 bytes 
       0 Dir(s) 8,351,670,272 bytes free 

t:\ftemp>type soap2.xsl 
<xsl:stylesheet version="2.0" 
    xpath-default-namespace="http://www.taleo.com/ws/integration/toolkit/2005/07" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pDest" select="'temp/'"/> 

<xsl:template match="/"> 
    <xsl:for-each select="//record"> 
    <xsl:result-document href="{$pDest}section{position()}.xml"> 
     <JobPositionPostings> 
     <JobPositionPosting> 
      <xsl:apply-templates select="field[@name='ContestNumber']"/> 
      <JobDisplayOptions> 
      <xsl:apply-templates 
        select="field[@name='ManagerRequisitionTitle']"/> 
      </JobDisplayOptions> 
     </JobPositionPosting> 
     </JobPositionPostings> 
    </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="field"> 
    <xsl:element name="{lower-case(@name)}"> 
    <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
t:\ftemp>rem Done! 
+0

привет, спасибо за ответ. Я использовал второй код xslt2.0, и я получил только одно имя файла otput section1.xml , пожалуйста, предложите мне, как получить все данные тега записи в отдельном XML-файле. 13000016 Менеджер проекта user1906222

+0

Обычно, когда я отправляю решение StackOverflow, как я уже говорил выше, включаю полную расшифровку вызова таблицы стилей. Если вы посмотрите выше, вы увидите, что я удаляю каталог, я запускаю таблицу стилей, я отмечаю создание файлов в каталоге, а затем показываю содержимое таблицы стилей. Это свидетельствует о том, что моя таблица стилей уже делает то, о чем вы просите. Я запускаю процессор Saxon, который является золотым стандартом для XSLT-процессоров. Если вы не получаете результаты, которые я получаю, я бы поставил под вопрос качество используемого вами XSLT-процессора. –

+0

привет, очень жаль, если я сказал что-то неправильно. Решение правильно, только я тестировал на http://xslttest.appspot.com here.im совершенно новый для этого xslt.i пытаюсь научиться. Я использую taleo connect client tool для преобразования его на xslt2.0 .более того, что у меня нет знаний. Спасибо за помощь. Есть проблема с инструментом анализатора только из-за того, что я не получаю output.oncae снова спасибо за помощь. – user1906222

Смежные вопросы