У меня есть следующий XML, и я хочу переименовать ENTINFO_ACCT-TYPE
в ENTINFO_ACCT_TYPE
(наряду со многими другими преобразованиями, которые можно увидеть в моем XSLT). Однако XSLT не может переименовать ENTINFO_ACCT-TYPE
. Я пытался переместить его до добавления корневого тега NORMDOC
, и это не имеет значения. Что я делаю неправильно? Я тестировал все на сайте это.
XML
<?xml version = "1.0" encoding = "UTF-8"?>
<NORMDOC>
<DOC>
<DOCID>123456789</DOCID>
<FI fitype = "B" xref = "54815594127">
<FIName>BANK OF FURY, N.A.</FIName>
<FITIN>987654321</FITIN>
</FI>
<OIs>
<OI xref = "54815594128">
<OIName>BANK OF FURY, N.A.</OIName>
</OI>
</OIs>
<Subjects>
<Subject stype = "PER" xref = "54815594140">
<SubjectFullName type = "L">SMITH/JANE/C</SubjectFullName>
<SubjectLastName type = "L">SMITH</SubjectLastName>
<SubjectFirstName type = "L">JANE</SubjectFirstName>
</Subject>
</Subjects>
<TXT>
<S sid = "123456789-SENT-001">Refer to <ENAMEX type = "BANKDIV" id = "BAN-123456789-000">FCI</ENAMEX>
<NUMEX type = "CASENUM" id = "CAS-123456789-001">Case # FRD-123</NUMEX>.</S>
<S sid = "123456789-SENT-075">For assistance contact <ENAMEX type = "BANK" id = "BAN-123456789-323">BANK OF FURY</ENAMEX> Law Enforcement Liaison at <IDEX type = "PHONE" id = "PHO-123456789-324">000-000-0000</IDEX> or <CYBEX type = "EMAIL" id = "EMA-123456789-325">[email protected]</CYBEX>.</S>
</TXT>
</DOC>
<ENTINFO ID = "ACC-123456789-013"
TYPE = "ACCOUNT"
NORM = "333222111000"
REFID = "ACC-123456789-013"
ACCT-TYPE = "CHK"
MENTION = "MI checking account # 333222111000"/>
<ENTINFO ID = "ACC-123456789-027"
TYPE = "ACCOUNT"
NORM = "000111222333444"
REFID = "ACC-123456789-027"
ACCT-TYPE = "UNK"
MENTION = "debit card #s 000111222333444"/>
</NORMDOC>
XSLT (код для переименования в последнем разделе)
<xsl:stylesheet version = "2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>
<xsl:strip-space elements = "*"/>
<xsl:template match = "/NORMDOC">
<xsl:apply-templates select = "DOC"/>
<ENTINFO>
<xsl:apply-templates select = "ENTINFO"/>
</ENTINFO>
</xsl:template>
<xsl:template match = "*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match = "TXT">
<RAW_TXT>
<xsl:value-of select = "."/>
</RAW_TXT>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match = "S">
<xsl:copy>
<xsl:apply-templates select = "*" mode = "extra"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "*" mode = "extra">
<xsl:element name = "{name()}_{@type}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match = "ENTINFO">
<xsl:copy>
<xsl:for-each select = "@*">
<xsl:element name = "ENTINFO_{name()}">
<xsl:value-of select = "." />
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match = "/">
<NORMDOC>
<xsl:apply-templates/>
</NORMDOC>
</xsl:template>
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match = "NORMDOC/ENTINFO/ENTINFO/ENTINFO_ACCT-TYPE">
<ENTINFO_ACCT_TYPE><xsl:apply-templates/></ENTINFO_ACCT_TYPE>
</xsl:template>
</xsl:stylesheet>
Ожидается (сокращенно)
<NORMDOC>
<DOC>
...
</DOC>
<ENTINFO>
<ENTINFO>
<ENTINFO_ID>ACC-123456789-027</ENTINFO_ID>
<ENTINFO_TYPE>ACCOUNT</ENTINFO_TYPE>
<ENTINFO_NORM>000111222333444</ENTINFO_NORM>
<ENTINFO_REFID>ACC-123456789-027</ENTINFO_REFID>
<ENTINFO_ACCT_TYPE>UNK</ENTINFO_ACCT-TYPE>
<ENTINFO_MENTION>debit card #s 000111222333444</ENTINFO_MENTION>
</ENTINFO>
</ENTINFO>
</NORMDOC>
Не могли бы вы просто изменить:
<xsl:template match = "ENTINFO">
<xsl:copy>
<xsl:for-each select = "@*">
<xsl:element name = "ENTINFO_{name()}">
<xsl:value-of select = "." />
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
к:
<xsl:template match = "ENTINFO">
<xsl:copy>
<xsl:for-each select = "@*">
<xsl:element name = "ENTINFO_{translate(name(), '-', '_')}">
<xsl:value-of select = "." />
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
Шаблон может соответствовать только узлам, существующим во входных данных, а не узлам, созданным вами в самом XSLT (если вы не выполняете преобразование за два прохода). Вы можете добавить шаблон, соответствующий @ACCT-TYPE
, но тогда вам также придется применять шаблоны ко всем атрибутам ENTINFO
вместо их обработки с помощью xsl:for-each
.
Я не знал, что ты так умеешь, спасибо. Однако почему мой исходный код не работает?