2016-11-15 6 views
2

Мой первый пост здесь, но здесь идет,XSLT Нужна помощь преобразования XML, чтобы показать значение и атрибут

У меня есть XML-документ, который выводится из системы сканирования, которая выглядит следующим образом.

<?xml version="1.0" encoding="UTF-8"?> 
<DOCUMENT> 
<DOCUMENTINDEX Name="Company">LR</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Contract Code">L1935</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Entry Date">2016-11-14</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Order Account">04060</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Order Raised By">Jonathan Banks</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Order Total">358</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Purchase Order Date">2016-11-14</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Purchase Order ID">PC022987-1</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Supplier Code">04060</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Supplier Name">Dynahurst Limited</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="VAT">71.6</DOCUMENTINDEX> 
</DOCUMENT>> 

мне нужно, чтобы выглядеть ниже,

<COMPANY>LR</COMPANY> 
<CONTRACT CODE>L1935</CONTRACT CODE> 

ETC ETC ....

Я пытаюсь использовать XSLT, чтобы разобраться в этом и до сих пор удалось вытащить Имя, но я не могу получить значение.

Мой сценарий до сих пор выглядит ...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
     <xsl:apply-templates select="//DOCUMENTINDEX"/> 
</xsl:template> 

<xsl:template match="DOCUMENTINDEX"> 
    <br/><xsl:value-of select="@Name"/> 
</xsl:template> 

Кто-нибудь знает, как я могу сделать это преобразование в качестве шаблона, так что я могу ввести это в программу сканирования, чтобы позволить ему преобразовать выходной документ в качестве они сканируются в систему.

Это дает мне следующий результат.

Company 
Contract Code 
Entry Date 
Order Account 
Order Raised By 
Order Total 
Purchase Order Date 
Purchase Order ID 
Supplier Code 
Supplier Name 
VAT 

Благодаря

Chris

ответ

0

Helo!

Вы можете получить значение в настоящее время обрабатываемого элемента с:

имя

<xsl:value-of select="."/>

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

translate(./@Name,' ','')

Вы можете создать XML-элемент с конструктором, где вы указываете свое имя:

<xsl:element name="{translate(./@Name,' ','')}"/>

Окончательный код будет выглядеть следующим образом:


<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="//DOCUMENTINDEX"/> 
    </xsl:template> 
    <xsl:template match="DOCUMENTINDEX"> 
     <xsl:element name="{translate(./@Name,' ','')}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо Filip это получило нас на правильном пути несколько tweeks и теперь у нас это работает так, как мы хотим. Большое вам спасибо за вашу помощь !!! Thanks – cgdean

+0

Без проблем :)! –

1

Вот один из возможных решений:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz '" /> 
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'" /> 

    <xsl:template match="/*"> 
     <xsl:for-each select="DOCUMENTINDEX"> 
      <xsl:variable name="name" select="@Name" /> 
      <xsl:element name="{translate($name, $smallcase, $uppercase)}"><xsl:value-of select="text()"/></xsl:element> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Пожалуйста, обратите внимание, что вы не можете иметь пробелы в именах элементов. Таким образом, в процессе трансформации я заменяю их символами подчеркивания _