У меня есть XML, похожий на этот:
<pack>
<titlesPacks>
<StoryPack id="1111111">
<value>A</value>
</StoryPack>
<StoryPack id="2222222">
<value>F</value>
</StoryPack>
</titlesPacks>
<referenceTable>
<TitleReference id="1111111" />
<TitleReference id="2222222" />
</referenceTable>
</pack>
Мне нужно скопировать XML-файл, но:
удалить StoryPack
узлов, где value
узел имеет определенное значение (например, A, B, C). Эта часть уже в порядке
удалить 'TitleReference nodes where
id attribute value is equal to
id
attribute value of' StoryPack
узлов, удаленных выше
Я незнаю, как сделать второй: я пытался с Key, но не работает:
Мой текущий XSL:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:data="http://example.com/data" exclude-result-prefixes="data">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="titleId" match="StoryPack" use="@id"/>
<!-- Values for wich nodes must be deleted -->
<data:data xmlns="">
<value>A</value>
<value>B</value>
<value>C</value>
</data:data>
<xsl:variable name="values" select="document('')/xsl:stylesheet/data:data/value"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Delete nodes with specific values -->
<xsl:template match="StoryPack[value = $values]"/>
<!-- Dlete nodes with id from specific values -->
<xsl:template match="TitleReference[StoryPack[key('titleId', @id)/value = $values]]" />
</xsl:stylesheet>
Спасибо за вашу помощь!
=============
После ответов @ michael.hor257k: мой исходный XML немного сложнее, поэтому, вероятно, он не работает в моем случае: Xpath ofзначение более глубокое: / Pack / titlePacks / StoryPack / assets / TitleAssets / assets / StringAssetInfo / value Итак, я сделал:
<xsl:template match="TitleReference[key('titleId', @id)/assets/TitleAssets/assets/StringAssetInfo[@attrId = '127']/value = $values]" />
, но это не работает.
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Pack>
<titlesPacks>
<StoryPack id="1111111">
<assets>
<TitleAssets>
<assets>
<StringAssetInfo attrId="127">
<value>A</value>
</StringAssetInfo>
</assets>
</TitleAssets>
</assets>
</StoryPack>
</titlesPacks>
<referenceTable>
<ReferenceTable>
<titlesReferences>
<TitleReference id = "1111111"/>
</titlesReferences>
</ReferenceTable>
</referenceTable>
</pack>
мне нужно
- удалить
StoryPack
где атрибут attrId
из StringAssetInfo
= 127 и value
= A или B ... => Уже в порядке - удалить
TitleReference
где id
значение атрибута = id
значение атрибута удаленных узлов выше