У меня есть этот XML:
<?xml version = "1.0" encoding = "UTF-8"?>
<Document>
<tag-one>
<tag-two>
<tag-three>
<tag-four>
<tag-five>
<tag-six>
<tag-seven>
<tag-eight>
<tag-nine>
<id-tag>valid_id</id-tag>
</tag-nine>
</tag-eight>
</tag-seven>
</tag-six>
</tag-five>
</tag-four>
</tag-three>
</tag-two>
<tag-two>
<tag-three>
<tag-four>
<tag-five>
<tag-six>
<tag-seven>
<tag-eight>
<tag-nine>
<id-tag>invalid_id-invalid_kg</id-tag>
</tag-nine>
</tag-eight>
</tag-seven>
</tag-six>
</tag-five>
</tag-four>
</tag-three>
</tag-two>
</tag-one>
</Document>
Я пытаюсь создать файл XSLT, который отфильтровывает элементы tag-two
, если соответствующие им id-tag
содержатся в списке.
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:transform
xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes = "#all"
version = "3.0">
<xsl:param name = "invalidIds"/>
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates select = "@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template
match = "tag-two[contains($invalidIds, tag-three/tag-four/tag-five//*[local-name()='id-tag'])]">
</xsl:template>
</xsl:transform>
Я передаю invalidIds
как список массивов в Java-коде, используя саксонскую библиотеку:
List<String> idList = Arrays.asList("invalid_id-invalid_kg");
// omitted rest of the code for brevity
// Map.of(new QName("invalidIds"), new XdmAtomicValue(idList.toString()))
Когда я распечатал значение invalidIds
в xslt, я получил следующее: [invalid_id-invalid_kg]
.
Проблема в том, что он фильтрует оба tag-two
, потому что похоже, что методы contains
действуют как содержит «Строка», а не как «Массив», а это означает, что «valid_id» соответствует условию... Есть ли у вас какие-либо идеи, как я могу исправить этот?
🤔 А знаете ли вы, что...
XML поддерживает международную символьную кодировку и может работать с текстом на различных языках.
Используйте https://www.saxonica.com/html/documentation12/javadoc/net/sf/saxon/s9api/XdmValue.html#makeSequence(java.lang.Iterable) в своем списке Java, например. Map.of(new QName("invalidIds"), XdmValue.makeSequence(idList))
.
И шаблон должен быть
<xsl:template match = "tag-two[$invalidIds = tag-three/tag-four/tag-five//id-tag]"/>