Можно ли построить документ XML из списка значений XPath и XSD XML? - PullRequest
2 голосов
/ 12 октября 2011

У меня есть список пар имя / значение, которые я хотел бы отобразить в XML-документе. Моя идея такова, назначьте каждому из имен XPath, как это:

Account_Number       = 4294587576-32      = /my:myFields/my:Customer/my:AccountNumber
Customer_Name        = John Smith         = /my:myFields/my:Customer/my:Name
Customer_Address     = Tampa, FL  33604   = /my:myFields/my:Customer/my:Address
Amount_Due           = 129.85             = /my:myFields/my:AmountDue/my:Amount
Days_Past_Due        = 54                 = /my:myFields/my:AmountDue/my:DaysPastDue

Теперь я не смогу взять эту информацию вместе с полным образцом XML-документа или XSD и создать XML-документ, который выглядит примерно так:

<my:myFields>
    <my:Customer>
        <my:Name>John Smith</my:Name>
        <my:AccountNumber>4294587576-32</my:AccountNumber>
        <my:Address>Tampa, FL  33604</my:Address>
    </my:Customer>
    <my:AmountDue>
        <my:DaysPastDue>54</my:DaysPastDue>
        <my:Amount>129.85</my:Amount>
    </my:AmountDue>
</my:myFields>

Мой вопрос относится к Microsoft InfoPath, потому что мне нужно взять список пар имя / значение и построить документ данных XML для формы InfoPath. Технология, которая выполняет перевод, не обязательно должна быть Microsoft. Java или C ++ будет лучшим решением. Можно ли это сделать с помощью процессора XSLT, такого как Apache's Xalan?

1 Ответ

2 голосов
/ 12 октября 2011

Вот одно предложение, поскольку вы упоминаете Java и XSLT, я бы не стал беспокоиться о Xalan и XSLT 1.0, а вместо этого использовал Saxon 9 и XSLT 2.0.Предполагая, что у вас есть правильно сформированный образец ввода XML и приведенное выше сопоставление значений с выражениями XPath, я бы передал это сопоставление в таблицу стилей XSLT 2.0, которая генерирует вторую таблицу стилей, которая затем может быть применена к входному примеру.Таким образом, предполагая, что у нас есть файл 'test2011101201.txt' в виде

Account_Number       = 4294587576-32      = /my:myFields/my:Customer/my:AccountNumber
Customer_Name        = John Smith         = /my:myFields/my:Customer/my:Name
Customer_Address     = Tampa, FL  33604   = /my:myFields/my:Customer/my:Address
Amount_Due           = 129.85             = /my:myFields/my:AmountDue/my:Amount
Days_Past_Due        = 54                 = /my:myFields/my:AmountDue/my:DaysPastDue

, таблица стилей

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:axsl="http://www.w3.org/1999/XSL/Transforma"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:my="http://example.com/my"
  version="2.0"
  exclude-result-prefixes="xs">

  <xsl:param name="text-file" as="xs:string" select="'test2011101201.txt'"/>
  <xsl:variable name="lines" as="xs:string*" select="tokenize(unparsed-text($text-file), '\r?\n')[normalize-space()]"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

  <xsl:template match="/">
    <axsl:stylesheet version="2.0">
      <axsl:template match="@* | node()">
        <axsl:copy>
          <axsl:apply-templates select="@*, node()"/>
        </axsl:copy>
      </axsl:template>
      <xsl:for-each select="$lines">
        <xsl:variable name="tokens" select="tokenize(., '=')"/>
        <axsl:template match="{normalize-space($tokens[3])}">
          <axsl:copy>
            <axsl:apply-templates select="@*"/>
            <axsl:text>
              <xsl:value-of select="replace($tokens[2], '(^\s+|\s+$)', '')"/>
            </axsl:text>
          </axsl:copy>
        </axsl:template>
      </xsl:for-each>
    </axsl:stylesheet>
  </xsl:template>

</xsl:stylesheet>

может быть запущена для создания второй таблицы стилей

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://example.com/my"
                version="2.0">
   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@*, node()"/>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/my:myFields/my:Customer/my:AccountNumber">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
         <xsl:text>4294587576-32</xsl:text>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/my:myFields/my:Customer/my:Name">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
         <xsl:text>John Smith</xsl:text>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/my:myFields/my:Customer/my:Address">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
         <xsl:text>Tampa, FL  33604</xsl:text>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/my:myFields/my:AmountDue/my:Amount">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
         <xsl:text>129.85</xsl:text>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/my:myFields/my:AmountDue/my:DaysPastDue">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
         <xsl:text>54</xsl:text>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

, котораяпри применении к входному сэмплу, например

<my:myFields xmlns:my="http://example.com/my">
    <my:Customer>
        <my:Name></my:Name>
        <my:AccountNumber></my:AccountNumber>
        <my:Address></my:Address>
    </my:Customer>
    <my:AmountDue>
        <my:DaysPastDue></my:DaysPastDue>
        <my:Amount></my:Amount>
    </my:AmountDue>
</my:myFields>

, выводит

<?xml version="1.0" encoding="UTF-8"?><my:myFields xmlns:my="http://example.com/my">
    <my:Customer>
        <my:Name>John Smith</my:Name>
        <my:AccountNumber>4294587576-32</my:AccountNumber>
        <my:Address>Tampa, FL  33604</my:Address>
    </my:Customer>
    <my:AmountDue>
        <my:DaysPastDue>54</my:DaysPastDue>
        <my:Amount>129.85</my:Amount>
    </my:AmountDue>
</my:myFields>

Как я уже говорил, для анализа текстового файла требуется XSLT 2.0 и процессор XSLT 2.0, например, Saxon 9.И тот, кто создает этот текстовый файл, должен убедиться, что выражения пути, которые таблица стилей отображает в шаблоны соответствия XSLT, не являются неоднозначными.

...