Вот одно предложение, поскольку вы упоминаете 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, не являются неоднозначными.