不确定元数据是否是正确的术语,但是我找不到更好的描述符。我有一个XML,需要通过几种方式进行转换,但是我特别需要ENTINFO
标签的帮助。我想做的是创建一个名为ENTINFO
的基本标记,然后在其中使每个ENTINFO标记成为一个单独的子字段。
我为其他转换编写了XSLT,但是当我以为我不需要ENTINFO标记时,它是从后面开始的,因此它目前不包含它们。我在文档中找不到有关如何执行需要做的事情的很多信息。
原始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@bankoffury.com</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"/>
</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:stylesheet>
实际输出
<DOC>
<DOCID>123456789</DOCID>
<FI>
<FIName>BANK OF FURY, N.A.</FIName>
<FITIN>987654321</FITIN>
</FI>
<OIs>
<OI>
<OIName>BANK OF FURY, N.A.</OIName>
</OI>
</OIs>
<Subjects>
<Subject>
<SubjectFullName>SMITH/JANE/C</SubjectFullName>
<SubjectLastName>SMITH</SubjectLastName>
<SubjectFirstName>JANE</SubjectFirstName>
</Subject>
</Subjects>
<RAW_TXT>Refer to FCICase # FRD-123.For assistance contact BANK OF FURY Law Enforcement Liaison at 000-000-0000 or email@bankoffury.com.</RAW_TXT>
<TXT>
<S>
<ENAMEX_BANKDIV>FCI</ENAMEX_BANKDIV>
<NUMEX_CASENUM>Case # FRD-123</NUMEX_CASENUM>
</S>
<S>
<ENAMEX_BANK>BANK OF FURY</ENAMEX_BANK>
<IDEX_PHONE>000-000-0000</IDEX_PHONE>
<CYBEX_EMAIL>email@bankoffury.com</CYBEX_EMAIL>
</S>
</TXT>
</DOC>
预期产量
<DOC>
<DOCID>123456789</DOCID>
<FI>
<FIName>BANK OF FURY, N.A.</FIName>
<FITIN>987654321</FITIN>
</FI>
<OIs>
<OI>
<OIName>BANK OF FURY, N.A.</OIName>
</OI>
</OIs>
<Subjects>
<Subject>
<SubjectFullName>SMITH/JANE/C</SubjectFullName>
<SubjectLastName>SMITH</SubjectLastName>
<SubjectFirstName>JANE</SubjectFirstName>
</Subject>
</Subjects>
<RAW_TXT>Refer to FCICase # FRD-123.For assistance contact BANK OF FURY Law Enforcement Liaison at 000-000-0000 or email@bankoffury.com.</RAW_TXT>
<TXT>
<S>
<ENAMEX_BANKDIV>FCI</ENAMEX_BANKDIV>
<NUMEX_CASENUM>Case # FRD-123</NUMEX_CASENUM>
</S>
<S>
<ENAMEX_BANK>BANK OF FURY</ENAMEX_BANK>
<IDEX_PHONE>000-000-0000</IDEX_PHONE>
<CYBEX_EMAIL>email@bankoffury.com</CYBEX_EMAIL>
</S>
</TXT>
</DOC>
<ENTINFO>
<ENTINFO>
<ENTINFO_ID>ACC-123456789-013</ENTINFO_ID>
<ENTINFO_TYPE>ACCOUNT</ENTINFO_TYPE>
<ENTINFO_NORM>333222111000</ENTINFO_NORM>
<ENTINFO_REFID>ACC-123456789-013</ENTINFO_REFID>
<ENTINFO_ACCTTYPE>CHK</ENTINFO_ACCTTYPE>
<ENTINFO_MENTION>MI checking account # 333222111000</ENTINFO_MENTION>
</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_ACCTTYPE>UNK</ENTINFO_ACCTTYPE>
<ENTINFO_MENTION>debit card #s 000111222333444</ENTINFO_MENTION>
</ENTINFO>
</ENTINFO>
答案 0 :(得分:0)
如果您将第一个模板更改为:
<xsl:template match="/NORMDOC">
<xsl:apply-templates select="DOC"/>
<ENTINFO>
<xsl:apply-templates select="ENTINFO"/>
</ENTINFO>
</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>
您应该得到问题中显示的结果。