Ниже приведен мой ввод XML. Как мне скопировать или сопоставить выбранные элементы, которые я хочу отразить в выводе XML, используя XSL.
Общая идея логики должна состоять в том, чтобы указывать только те элементы, которые меня интересуют, вместо того, чтобы указывать элементы, которые мне не нравятся, чтобы включать их в вывод. Элементы, которые я хочу отразить в моем выходном XML, всегда присутствуют в XML Inpput. Остальные элементы различаются в зависимости от того, что сгенерировала система, и поэтому я не могу просто указать, что удалить.
Я смог сделать это без пространства имен из ввода, выполнив копирование, но когда пространство имен присутствует, код не работает.
Я нашел способ удалить пространство имен, но в сочетании с копией не сработал. Я совершенно не понимаю, как ведет себя XSL.
Пожалуйста, согласитесь с моим запросом, я очень плохо знаком с XML и XSL, и мне было поручено выполнить эту задачу, потому что никто из нашей команды не имел опыта работы с XML. Заранее спасибо.
Ввод XML:
<Transaction xmlns="http://www.test.com/rdc.xsd">
<Transaction>
<StoreName id="aa">STORE A</StoreName>
<TransNo>TXN0001</TransNo>
<RegisterNo>REG001</RegisterNo>
<Items>
<Item id="1">
<ItemID>A001</ItemID>
<ItemDesc>Keychain</ItemDesc>
</Item>
<Item id="2">
<ItemID>A002</ItemID>
<ItemDesc>Wallet</ItemDesc>
</Item>
</Items>
<IDONTLIKETHIS_1>
<STOREXXX>XXX</STOREXXX>
<TRANSXXX>YYY</TRANSXXX>
</IDONTLIKETHIS_1>
<IDONTLIKETHIS_2>
<STOREXXX>XXX</STOREXXX>
<TRANSXXX>YYY</TRANSXXX>
</IDONTLIKETHIS_2>
</Transaction>
</Transaction>
Желаемый вывод:
<Transaction>
<Transaction>
<StoreName id="aa">STORE A</StoreName>
<TransNo>TXN0001</TransNo>
<RegisterNo>REG001</RegisterNo>
<Items>
<Item id="1">
<ItemID>A001</ItemID>
<ItemDesc>Keychain</ItemDesc>
</Item>
<Item id="2">
<ItemID>A002</ItemID>
<ItemDesc>Wallet</ItemDesc>
</Item>
</Items>
</Transaction>
</Transaction>
Я пробовал приведенный ниже код, но проблема в том, что мне не хватает второго элемента Transaction, а в корневом элементе присутствует атрибут xmlns:
<xsl:template match="*">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="node()[not(self::*)]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="x:Transaction/x:StoreName"/>
<xsl:copy-of select="x:Transaction/x:TransNo"/>
<xsl:copy-of select="x:Transaction/x:RegisterNo"/>
<xsl:copy-of select="x:Transaction/x:Items"/>
</xsl:copy>
</xsl:template>