从终端到 Windows Powershell 的 Xmlstarlet 命令

Xmlstarlet command from terminal to Windows Powershell

在我的终端机上 (linux/mac) 我使用这个:

xmlstarlet ed -N ns=http://www.w3.org/2006/04/ttaf1 -d //ns:div[not(contains(@xml:lang,'Italian'))] "C:\UsersH144708H\Downloads\a.mul.ttml" > "C:\UsersH144708H\Downloads\a.mul.ttml.conv"

On windows (powershell) 我真的不知道如何修复这个命令。我知道我需要使用 $ 而不是 @(因为 powershell 说要使用 $ 而不是 @),但是 contains:

有问题
./xml.exe ed -N ns=http://www.w3.org/2006/04/ttaf1 -d //ns:div[not(contains($xml:lang,'Italian'))] "C:\UsersH144708H\Downloads\a.mul.ttml" > "C:\UsersH144708H\Downloads\a.mul.ttml.conv"

我什至试过这个:

./xml.exe ed -N ns=http://www.w3.org/2006/04/ttaf1 -d //ns:div[not($xml:lang -contains'Italian')] "C:\UsersH144708H\Downloads\a.mul.ttml" > "C:\UsersH144708H\Downloads\a.mul.ttml.conv"

但我得到 "failed to load external entity "False""

//ns:div[not(contains(@xml:lang,'Italian'))] 是一个 XPath 表达式,它包含一些对各种 shell 来说是特殊的字符,因此你应该用引号保护它。在 bash、Powershell 和 cmd.exe:

中使用双引号
xmlstarlet ed -N ns=http://www.w3.org/2006/04/ttaf1 -d "//ns:div[not(contains(@xml:lang,'Italian'))]" "C:\UsersH144708H\Downloads\a.mul.ttml" > "C:\UsersH144708H\Downloads\a.mul.ttml.conv"

使用 bash 或 Powershell 时,最好使用单引号;对于那些 shell,需要防止 $ 的扩展(尽管在 XPath 中使用它是相当高级的):

xmlstarlet ed -N ns=http://www.w3.org/2006/04/ttaf1 -d '//ns:div[not(contains(@xml:lang,"Italian"))]' "C:\UsersH144708H\Downloads\a.mul.ttml" > "C:\UsersH144708H\Downloads\a.mul.ttml.conv"

请注意,内部引号也需要交换。